如何在不全局禁用的前提下关闭Restify bodyParser对multipart文件上传的解析
Restify 7 仅禁用BodyParser对multipart/form-data请求解析的方案
核心原因
Restify 7的restify.plugins.bodyParser默认启用了multipart解析能力,会提前消费multipart/form-data类型的请求流,导致multer无法读取到上传的文件内容。
解决方案
修改全局bodyParser的注册配置,显式关闭multipart解析即可,其他类型请求的解析逻辑完全不受影响:
将原有代码中全局注册bodyParser的行:
server.use(restify.plugins.bodyParser());
替换为:
server.use(restify.plugins.bodyParser({ multipart: false }));
修改后的完整可运行代码
const restify = require('restify'); const errors = require('restify-errors'); const aws = require('aws-sdk'); const multer = require('multer'); const multerS3 = require('multer-s3'); const server = restify.createServer(); server.use(restify.plugins.acceptParser(server.acceptable)); // 仅关闭multipart解析,其余类型请求解析正常生效 server.use(restify.plugins.bodyParser({ multipart: false })); // Set S3 endpoint to DigitalOcean Spaces const spacesEndpoint = new aws.Endpoint('nyc3.digitaloceanspaces.com'); const s3 = new aws.S3({ endpoint: spacesEndpoint }); const upload = multer({ storage: multerS3({ s3: s3, bucket: 'space_name', acl: 'public-read', key: function (request, file, cb) { console.log(file); cb(null,new Date().toISOString()); } }) }).single('logo'); server.post('/upload', async (req, res, next) => { upload(req, res, async (error) => { if (error) { console.log(error); return next(new errors.InvalidContentError(error)); } console.log('File uploaded successfully.'); res.send(200); next(); }); });
注意事项
如果修改后依然存在问题,检查项目中是否注册了restify.plugins.formParser等其他会处理multipart请求的中间件,如有需要同步关闭或移除。
内容的提问来源于stack exchange,提问作者Ismael
相关产品推荐
相关产品推荐

