带有蓝鸟承诺的sails.js req.file.upload

dul*_*lan 3 upload promise sails.js

我使用sails.js作为我的后端与bluebird承诺,我尝试使用req.file.upload上传文件,回调方式工作正常,文件上传:

req.file('file').upload({
    maxBytes: 2000000,
    dirname: 'uploadFolder'
}, function (err, files) {
    if (err) {
        return res.serverError(err);
    }
    return res.ok();
}
Run Code Online (Sandbox Code Playgroud)

但承诺的方式不是:

var Promise = require('bluebird');
var fileUploader = Promise.promisify(req.file('file').upload);
fileUploader({
    maxBytes: 2000000,
    dirname: currentUploadFolder
}).then(function(files) {
    console.log(files);
    return Promise.resolve(files);
}).catch(function(err) {
    console.log(err);
    return Promise.reject(err);
});
Run Code Online (Sandbox Code Playgroud)

文件没有上传,控制台一直在抱怨:

data:    app.js:1800 - [TypeError: Cannot read property 'length' of undefined]
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

Eug*_*kov 7

这种情况很独特,你不能promisify在这里使用.您需要创建新的Promise并将其返回.

return new Promise(function(resolve, reject) {
  req.file('file').upload({
    maxBytes: 2000000,
    dirname: 'uploadFolder'
  }, function (error, files) {
    return error ? reject(error) : resolve(files);
  }
});
Run Code Online (Sandbox Code Playgroud)

您可以将它移动到helper\services\whatever,并得到类似的东西

// api/services/UploadService.js
module.exports = {
  uploadFile: function(req) {
    return new Promise(function(resolve, reject) {
      req.file('file').upload({
        maxBytes: 2000000,
        dirname: 'uploadFolder'
      }, function (error, files) {
        return error ? reject(error) : resolve(files);
      }
    });
  }
};

// api/controllers/AnyController.js
module.exports = {
  upload: function(req, res) {
    UploadService
      .uploadFile(req)
      .then(res.ok)
      .catch(res.negotiate);
  }
};
Run Code Online (Sandbox Code Playgroud)