Multer 和快速验证器在验证中造成问题

2024-02-29

我正在提交带有图像的表格。使用下面的代码。

router.post("/", upload.upload('image').single('categoryLogo'), categoryRules.categoryCreationRules(), validate, categoryController.createCategory);

它工作正常,但是需要进行一些验证,然后静态图像才会保存在磁盘中。 所以我尝试的是:

router.post("/", categoryRules.categoryCreationRules(), validate,upload.upload('image').single('categoryLogo'), categoryController.createCategory);

但在这个快速验证器中得到空白主体,因此它经常抛出验证错误。 我应该做什么,我在谷歌上搜索,但没有找到任何有用的信息,我是节点中的新手。

规则代码:

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.")
    ];
}

理论上来说,跑步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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Multer 和快速验证器在验证中造成问题 的相关文章

随机推荐