sails.js req.file.upload 蓝鸟承诺

sails.js req.file.upload with bluebird promise

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

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

但 promise 方式没有:

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);
});

文件没有上传,控制台一直报错:

data:    app.js:1800 - [TypeError: Cannot read property 'length' of undefined]

有什么想法吗?

这种情况是独一无二的,您不能在此处使用 promisify。您需要创建新的 Promise 并 return 它。

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

你可以把它移到 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);
  }
};