Multer 和 express-validator 在验证中产生问题
Multer and express-validator creating problem in validation
我正在提交带有图片的表单。使用以下代码。
router.post("/", upload.upload('image').single('categoryLogo'), categoryRules.categoryCreationRules(), validate, categoryController.createCategory);
它工作正常,但经过一些验证后静态图像正在保存在磁盘中。
所以我尝试的是:
router.post("/", categoryRules.categoryCreationRules(), validate,upload.upload('image').single('categoryLogo'), categoryController.createCategory);
但是在这个快速验证器中得到空白正文,所以它经常抛出验证错误。
我应该怎么做,我在 google 上搜索,但我没有找到任何有用的信息我是节点中的新手。
规则代码:
const categoryCreationRules = () => {
return [
check('name')
.isLength({ min: 1 })
.trim()
.withMessage("Category name is required."),
check('name').custom((name)=>{
return CategoryModel.findOne({name: name}).collation({locale:'en',strength: 2})
.then(category=>{
if(category){
return Promise.reject(category.name+" category already exsist.");
}
})
}),
check('name')
.isLength({max: 100})
.trim()
.withMessage("Category name should not exceed more then 100 characters."),
check('description')
.isLength({max: 255})
.trim()
.withMessage("Category description should not exceed more then 255 characters.")
];
}
要上传图片,您已将表单的 enctype 设置为 multipart/form-data。但是如果你以后使用 multer,你没有解析表单数据,因此可能会给出未定义的。
请检查 npm 模块 multiparty
https://www.npmjs.com/package/multiparty
它还会解析其他字段以及文件上传和验证,可能很容易设置。
理论上,multer
之前的运行categoryCreationRules
和validate
中间件就够了。因此,您只需要在请求正文中进行验证,如果它包含任何错误,您只是 return 错误的请求响应,而不是让请求传递到下一个中间件(在本例中为 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
和 name
,然后执行验证代码。
发生这种情况是因为 multer 在内部使用名为 busboy 的库将 multipart/form-data
请求解析为 body
,这样您就可以通过 req.body 访问字段。
因此,我认为最好的方法是在验证中间件之前调用 multer 中间件:
router.post("/", upload.upload('image').single('categoryLogo'), categoryRules.categoryCreationRules(), validate, categoryController.createCategory);
然后,如果验证有错误,您将删除从 multer 创建的文件和 return 一个 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-unable-to-obtain-form-data-from-post-request
我正在提交带有图片的表单。使用以下代码。
router.post("/", upload.upload('image').single('categoryLogo'), categoryRules.categoryCreationRules(), validate, categoryController.createCategory);
它工作正常,但经过一些验证后静态图像正在保存在磁盘中。 所以我尝试的是:
router.post("/", categoryRules.categoryCreationRules(), validate,upload.upload('image').single('categoryLogo'), categoryController.createCategory);
但是在这个快速验证器中得到空白正文,所以它经常抛出验证错误。 我应该怎么做,我在 google 上搜索,但我没有找到任何有用的信息我是节点中的新手。
规则代码:
const categoryCreationRules = () => {
return [
check('name')
.isLength({ min: 1 })
.trim()
.withMessage("Category name is required."),
check('name').custom((name)=>{
return CategoryModel.findOne({name: name}).collation({locale:'en',strength: 2})
.then(category=>{
if(category){
return Promise.reject(category.name+" category already exsist.");
}
})
}),
check('name')
.isLength({max: 100})
.trim()
.withMessage("Category name should not exceed more then 100 characters."),
check('description')
.isLength({max: 255})
.trim()
.withMessage("Category description should not exceed more then 255 characters.")
];
}
要上传图片,您已将表单的 enctype 设置为 multipart/form-data。但是如果你以后使用 multer,你没有解析表单数据,因此可能会给出未定义的。
请检查 npm 模块 multiparty
https://www.npmjs.com/package/multiparty
它还会解析其他字段以及文件上传和验证,可能很容易设置。
理论上,multer
之前的运行categoryCreationRules
和validate
中间件就够了。因此,您只需要在请求正文中进行验证,如果它包含任何错误,您只是 return 错误的请求响应,而不是让请求传递到下一个中间件(在本例中为 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
和 name
,然后执行验证代码。
发生这种情况是因为 multer 在内部使用名为 busboy 的库将 multipart/form-data
请求解析为 body
,这样您就可以通过 req.body 访问字段。
因此,我认为最好的方法是在验证中间件之前调用 multer 中间件:
router.post("/", upload.upload('image').single('categoryLogo'), categoryRules.categoryCreationRules(), validate, categoryController.createCategory);
然后,如果验证有错误,您将删除从 multer 创建的文件和 return 一个 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-unable-to-obtain-form-data-from-post-request