sails.js中使用bluebird promise进行req.file.upload

3

我正在使用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]

任何想法请告诉我?

app.js:1800上有什么内容?我不直接使用promises,但我会在fibers中使用它们,所以upload的promisified版本对我来说可以正常工作。你的.then被调用了吗?还是直接进入catch了? - Lu Roman
App.js 1800只是一些调试信息,应该被忽略,我认为.then没有被调用,直接进入catch。 - dulan
尝试使用upstream.upload = Promise.promisify(upstream.upload),其中upstream是对req.file('file')的引用,因此您将在上游环境中调用upload函数,请告诉我它是否有效。我现在无法测试,所以我不想立即创建答案。 - Lu Roman
这种方式对我来说似乎不起作用,我最终使用了常规的req.file.upload回调方式,无论如何还是谢谢! - dulan
1个回答

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

您可以将其移动到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);
  }
};

我认为你的解决方案是可行的,但是在我的理解中,新的 Promise 似乎是一种反模式?无论如何,最终我只使用了回调函数,省去了很多麻烦,还是谢谢你!已接受为答案。 - dulan
不,不是这样的。在这里,您可以阅读有关Promise反模式的内容 - http://taoofcode.net/promise-anti-patterns/。但实际上,创建自己的Promise并不是一种反模式。 - Eugene Obrezkov
@ghaiklor 你能再测试一遍吗?我也在做同样的事情,但文件大小限制在100kb左右,很奇怪。 - trungducng
1
@trungducng 注意Sails的文档。我敢打赌,他们已经为此更改了接口。 - Eugene Obrezkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接