有没有办法在 Multer 上传文件之前使用 Joi 验证多部分/表单数据请求?

问题描述 投票:0回答:1

我正在尝试从邮递员将文件上传到我的 Node-js 后端服务,其中包含电子邮件、用户名等额外字段。

我已经用 multer 做到了这一点,尽管我想阻止 multer 在缺少额外字段的情况下将数据上传到云端。所以我尝试使用 Joi 来验证架构,但没有成功。

这是我尝试过的代码:

const upload = multer({
  storage: new MulterGoogleCloudStorage({
    autoRetry: true,
  })
});

function validateRequest(req: any, res: any, next: () => void) {
    const validator = metadataValidator.validate(req.body);
    if (validator.error) {
      return res.status(400).send("Missing properties.");
    }

    next();
}

router.post('/upload', validateRequest, upload.array("files"), (req, res) => {
 ...
})

我知道 multer 中间件必须位于其他处理程序之前,因为它将表单数据解析为正文。所以我必须这么做:

router.post('/upload', upload.array("files"), validateRequest, (req, res) => {
 ...
})

这可以工作,但即使请求在 validateRequest 处理程序上失败,它也已经上传了文件。我正在努力弄清楚我应该做什么。

如果没有找到其他字段,如何阻止 multer 自动上传文件。

预计: 我预计在发送没有必填字段的请求时,它将失败并且不会上传文件。

实际: 无论我做什么,即使验证失败,我也会将文件上传到云端。

我也尝试过:

没有运气。

node.js express multer joi
1个回答
0
投票

由于您似乎正在验证

req.body
,而不是文件,因此您可以在验证中间件完成后从路由手动调用上传中间件:

const upload = multer({
  storage: new MulterGoogleCloudStorage({
    autoRetry: true,
  })
}).array("files");


//...


router.post('/upload', validateRequest, (req, res) => {
 
  upload(req, res, function (err) {

    if (err instanceof multer.MulterError) {
      // A Multer error occurred when uploading.
    } else if (err) {
      // An unknown error occurred when uploading.
    }

    // Everything went fine.

    });

});

参见文档中的示例:错误处理

© www.soinside.com 2019 - 2024. All rights reserved.