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之前的运行categoryCreationRulesvalidate中间件就够了。因此,您只需要在请求正文中进行验证,如果它包含任何错误,您只是 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 就不会发生这种情况 - 您将能够访问正文字段,例如 descriptionname,然后执行验证代码。

发生这种情况是因为 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