【问题标题】:Multer validation with joi使用 joi 进行 Multer 验证
【发布时间】:2020-08-04 21:52:02
【问题描述】:

我创建了一个端点来发布和上传 csv 文件以在 Node.js 中进行处理。它工作正常,但我试图弄清楚如何在上传文件之前验证一些事情。

一个示例请求是:

{
    "test_doc": "/path/to/file/test.csv"
    "offset": [0,1]
}

我希望表单要求“test_doc”并且只接受 csv 文件并且“偏移量”是可选的

“偏移”的架构有效,但我不确定如何使用 multer 验证文件,尤其是在上传之前。

下面的示例代码

const upload = multer({ dest: "/tmp" });

router.post("/", upload.single("test_doc"), async (req, res) => {
    const schema = joi.object().keys({
        offset: joi.array().items(joi.number().min(-60).max(60)).min(1).max(2)
    });
});

【问题讨论】:

    标签: javascript node.js express multer joi


    【解决方案1】:

    您可以使用 fileFilter 方法在 Multer 中验证文件类型。 fileFilter 方法是 Multer 中间件自带的内置方法:

    const upload = multer({
        dest: "/tmp",
        fileFilter: (req, file, cb) => {
          if (file.mimetype == "text/csv" && file.fieldname === "test_doc") {
            cb(null, true);
          } else {
            cb(null, false);
            return cb(new Error('Invalid upload: fieldname should be test_doc and .csv format '));
          }
        }
      });
    

    【讨论】:

    • 是的,我最终找到了这个,但遇到了一个问题,即由 excel 制作的 csv 没有返回 csv 的 mimetype。另外,我将如何验证“test_doc”的字段名?是否也可以在上传文件之前验证可选的“偏移量”字段?
    • 我将答案更新为 fileFilter 中的附加条件。对于偏移量,您可以在 fileFilter 方法中添加现有验证,并且您可以访问请求(文本字段可在请求正文中访问:req.body.offset,
    • 我还有一些问题。 req.body 在 fileFilter 内为空,因此不存在偏移量。此外,如果参数名称不是“test_doc”并且只是发回一个错误,fileFilter 似乎根本不会运行,我认为这与upload.single(“test_doc”)有关。还有一种方法可以用状态码和错误消息而不是 cb 返回的所有内容来发送错误吗?
    • 你需要问另一个问题,这将是一个完全不同的答案。
    • 我可以验证偏移量的唯一方法是在文件上传之后并且没有找到其他方法,我不知道为什么我需要问另一个问题来验证参数名称,因为它在我的最初的问题。在此示例中,当在 JSON 请求中提供不同的字段名时,文件过滤器根本不会运行。
    猜你喜欢
    • 2020-05-11
    • 2020-03-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2020-06-17
    • 2016-02-19
    • 2020-01-25
    • 2020-09-16
    相关资源
    最近更新 更多