multer中的cb是什么?

时间:2019-04-30 16:50:53

标签: javascript node.js express multer

在下面的代码中,从multer API中,目标和文件名选项都是匿名函数。这两个函数都有一个名为 cb 的参数。这些回调函数是在multer模块中定义的,还是应该提供它们?

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/tmp/my-uploads')
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now())
  }
})

var upload = multer({ storage: storage }

3 个答案:

答案 0 :(得分:1)

简短答案:您提供了回调。

cb是一个接受2个参数的回调函数。

您可以在两种方法的使用场景中看到这一点。例如...

let req = true;
let file = 'MyFile.txt';
function myCallbackFunc = function(value1, value2){ console.log('my callback function'); };
storage.filename(req, file, myCallbackFunc));

请理解,我不知道“ req”或“ file”参数应该是什么样,所以我只是为示例制作了一些东西。

答案 1 :(得分:1)

注意:我不知道什么是穆尔特

让我们说你有一个功能,

 function destination(req, files){
    //something happen here
 }

现在在您的代码中,您可以使用两个参数调用此函数

destination(req, files);

现在,如果您需要在完成上述功能后立即执行另一个功能,则需要有一个回调函数。 假设您需要在完成目标功能后console.log('Hello world')

destination(req, files , function(){
    console.log('hello world')
});

我确定您知道这种功能。现在的问题是目标函数仅接受2个参数,因此我们需要在函数定义中添加另一个参数。让我们将第三个参数称为“ cb”

 function destination(req, files, cb){
    //something happen here
 }

现在cb应该是什么类型?它应该是一个功能。是不是 因此,如果第三个参数是一个函数,那么我们必须在某个地方执行此cb函数。执行cb函数的最佳位置是在目标函数内部的所有代码之后。

 function destination(req, files, cb){
    //something happen here
    cb();
 }

这里有一个回调函数!如果您思考得很深,您将理解为什么他们引入了JavaScript Promises

答案 2 :(得分:1)

答案是:是multer提供cb。是的,奇怪的文档对此一无所知。

此回调是所谓的错误优先功能,因此,当检查 req 文件时,您可能会确定该用户上传了错误的内容,并传递了 new Error( )作为第一个参数,它将作为响应返回。不过请注意,它将在您的应用程序中引发未处理的异常。因此,我更喜欢始终传递null并在相应的控制器中处理用户输入。

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    const error = file.mimetype === 'image/jpeg'
      ? null
      : new Error('wrong file');
    cb(error, '/if-no-error-upload-file-to-this-directory');
  },
  //same for filename
});