使用when/node将Amazon S3函数转换为承诺时出错



我正在尝试解除AWS S3异步功能,并遇到一个奇怪的错误。给定以下代码,

var s3 = new AWS.S3();
var when = require('when');
var nodefn = require('when/node');
var getObjectP = nodefn.lift(s3.getObject);
getObjectP({
    Bucket: 'bucket_name',
    Key: 'key_name'
})
.then(function(data) {
    ...
}, function(err) {
    ...
});

我得到这个错误,

Object #<Object> has no method 'makeRequest'

这是getObject正常情况下的样子(当我使用回调而不是承诺时,它工作得很好):

s3.getObject({ ... }, function(err, data) {
    ...
});

我是否误用了nodefn.lift ?这看起来很简单。这里是文档给感兴趣的人。https://github.com/cujojs/when/blob/master/docs/api.md nodelift

方法可能有错误的上下文,因为它不是作为方法调用的。Try to bind it:

var getObjectP = nodefn.lift(s3.getObject.bind(s3));

AWS Javascript SDK现在支持Promises(https://aws.amazon.com/blogs/developer/support-for-promises-in-the-sdk/)。你可以使用内置的Promise实现(如果你使用ES6),也可以使用几个可用的Javascript Promise库之一。

Using When Promise Library

var AWS = require('aws-sdk');
AWS.config.setPromisesDependency(require('when'));
var s3 = new AWS.S3();
s3.getObject({
    Bucket: 'bucket_name',
    Key: 'key_name'
}).promise()
.then(function(data) {
    ...
}, function(err) {
    ...
});

使用ES6内置承诺库

var AWS = require('aws-sdk');
var s3 = new AWS.S3();
s3.getObject({
    Bucket: 'bucket_name',
    Key: 'key_name'
}).promise()
.then(function(data) {
    ...
}, function(err) {
    ...
});

所以两者的区别是一行

最新更新