我正在尝试从邮递员将文件上传到我的 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 自动上传文件。
预计: 我预计在发送没有必填字段的请求时,它将失败并且不会上传文件。
实际: 无论我做什么,即使验证失败,我也会将文件上传到云端。
我也尝试过:
没有运气。
由于您似乎正在验证
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.
});
});
参见文档中的示例:错误处理