理论上来说,跑步categoryCreationRules
and validate
之前的中间件multer
就足够了。因此,您只需要在请求正文中进行验证,如果它包含任何错误,您只需返回错误的请求响应,而不让请求传递到下一个中间件(在本例中为 multer)。
我正在谈论的一个简单的例子:(只是为了清楚起见,下面的代码不起作用)
router.post("/", categoryRules.categoryCreationRules(), validate, upload.upload('image').single('categoryLogo'), categoryController.createCategory);
const validator = (req, res, next) => {
try {
validationResult(req).throw();
// Continue to next middleware, in this case, multer.
next();
} catch (errors) {
// return bad request
res.status(400).send(errors);
}
};
这行不通,因为你的req.body
将是未定义的,因为您将数据作为multipart/form-data
(一般用于上传文件)。在这种情况下,错误将永远是正确的。
但有了 multer,这种情况就不会发生 - 您将能够访问身体字段,例如description
and name
然后做验证码。
发生这种情况是因为 multer 在内部解析了multipart/form-data
请求body
有一个名为busboy https://github.com/mscdex/busboy,这样您就可以通过 req.body 访问字段。
因此,我认为最好的方法是在验证中间件之前调用 multer 中间件:
router.post("/", upload.upload('image').single('categoryLogo'), categoryRules.categoryCreationRules(), validate, categoryController.createCategory);
之后,如果验证出错,则删除从 multer 创建的文件并返回bad request
响应,类似这样的:
const fs = require("fs");
const validator = (req, res, next) => {
try {
validationResult(req).throw();
// continue to next middleware
next();
} catch (errors) {
fs.unlink(req.file.path, (err) => {
if (err) {multipart/form-data
/* HANLDE ERROR */
}
console.log(`successfully deleted ${req.file.path}`);
});
// return bad request
res.status(400).send(errors);
}
};
您可以在以下链接中获取有关此内容的更多信息:
node-js-with-express-bodyparser-无法从请求后获取表单数据 https://stackoverflow.com/a/34922384/4774045
请求主体未定义多部分 https://stackoverflow.com/a/44850924/4774045
html-multipart-form-data-error-in-req-body-using-node-express https://stackoverflow.com/a/28991590/4774045