【问题标题】:Why multer should upload files before any operation?为什么multer应该在任何操作之前上传文件?
【发布时间】:2018-09-02 00:11:58
【问题描述】:

Multer 在 express 之上的工作方式是有线的!为什么 Multer 应该在中间件链中的控制器之前,这在设计上会导致服务器在 DB 操作被检查之前上传东西?

例如,如果对文章进行了 post 操作,并且它包含一堆字段,其中一个是文件。

articleModel{title:String,image:String};
router.post('/', multer, articleController.createArticle);

现在在请求命中时,链中的第一件事是上传请求中的文件,但是如果在将记录执行到数据库时发生错误,例如验证甚至重复,我该怎么办?只更新文章标题?旧文件会重新上传吗?

如何让multer在http操作回调的响应中上传文件?

【问题讨论】:

  • 你不能在 multer 中间件之前添加一个前面的中间件来处理 DB 的东西吗?你可以有多个中间件。
  • 不,因为如果稍后执行multer中间件,req.files中的文件路径将未定义,所以我不能

标签: node.js express multer


【解决方案1】:

您确实可以在 Multer 实际处理图像之前制作各种东西:

var upload = multer({
  dest: 'uploads/',
  fileFilter: function (req, file, cb) {
    // only images are allowed
    var filetypes = /jpeg|jpg|png/;
    var mimetype = filetypes.test(file.mimetype);
    var extname = filetypes.test(path.extname(file.originalname).toLowerCase());

    if (mimetype && extname) {
      return cb(null, true);
    }
    cb("Error");
  }
}).single('localImg');

app.post('/api/file', checkBody, auth, uploadFile, controller.aController);

以这段代码为例,您可以在 multer 处理您的文件之前进行各种中间件操作,但 multer 是一个用于处理 multipart/form-data 的库,而不仅仅是文件,人们使用 multipart主要用于发送文件,但您也可以发送各种数据,并将它们附加到正文(req.body)

您的问题是:“为什么 multer 应该在任何操作之前上传文件?” 您可以随时执行 multer,但 multer 会处理请求并将您的数据放入正文中。除非您不需要第一手的正文数据,否则您需要将 multer 放在第一个中间件中。

您的另一个问题是:“如果我只更新文章标题怎么办?旧文件会重新上传吗?”

不,它只会上传一次,如果数据库有任何问题,任何错误或拒绝,您可以随时使用文件系统(fs)从您的服务器中删除文件,如果您已经上传到第三方派对系统,你可以删除它。

希望对你有帮助

【讨论】:

  • 是的,它同时是uploader和body field handler,没有退出
猜你喜欢
  • 2021-08-07
  • 2017-05-30
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
相关资源
最近更新 更多