Node.js 为什么multer在任何操作之前都要上传文件?

Node.js 为什么multer在任何操作之前都要上传文件?,node.js,express,multer,Node.js,Express,Multer,他们认为穆特在快车上工作的方式是有线的!,为什么Multer应该在中间件链中的控制器之前,这在设计上会导致服务器在检查DB操作之前上传内容 例如,如果有一个文章的post操作,它包含一堆字段,其中一个是文件 articleModel{title:String,image:String}; router.post('/', multer, articleController.createArticle); 现在,当请求到达时,链中的第一件事是在请求中上载文件,但是如果在执行记录到DB时发生错误,

他们认为穆特在快车上工作的方式是有线的!,为什么Multer应该在中间件链中的控制器之前,这在设计上会导致服务器在检查DB操作之前上传内容

例如,如果有一个文章的post操作,它包含一堆字段,其中一个是文件

articleModel{title:String,image:String};
router.post('/', multer, articleController.createArticle);
现在,当请求到达时,链中的第一件事是在请求中上载文件,但是如果在执行记录到DB时发生错误,比如验证,甚至重复,那么如果我只更新文章标题呢?旧文件是否将再次上载


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

在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是一个处理多部分/表单数据的库,不仅仅是文件,人们主要使用多部分发送文件,但您也可以发送所有类型的数据,并将它们附加到正文(req.body)

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

你的另一个问题是:“如果我只更新文章标题怎么办?旧文件将再次上传?”

否,它将上载一次,如果数据库出现任何问题、任何错误或拒绝,您可以始终使用文件系统(fs)从服务器中删除该文件,如果您已经将其上载到第三方系统,则可以将其删除


希望能有所帮助

难道你不能在multer中间件之前添加一个执行DB任务的中间件吗?您可以有多个中间件。否,因为如果稍后执行multer中间件,req.files中的文件路径将是未定义的,因此我可以是,它同时是上载程序和body字段处理程序,没有退出