以下代码是从S3获取CSV数据并将其转换为JSON。我在下面出现.then is not a function
错误。可能是什么问题?
var Papa = require('papaparse');
var AWS = require('aws-sdk')
let deferred = this.$q.defer();
s3.getObject(params, function (err, data) {
if (err) {
//console.log(err, err.stack);
deferred.reject(err);
}
else {
const csv = data.Body.toString('utf-8');
const headers = 'id,start,end,count';
const parsed = Papa.parse(headers + '\n' + csv, parseOptions);
var parsedData = parsed.data;
console.log(parsedData); //this works
deferred.resolve(parsedData); // resolve the deferred with the data
}
return deferred.promise;
}).then(function(parsedData) {
console.log(parsedData);
}).catch( function(err) {
console.log(err, err.stack);
});
}
s3.getObject(params, function (err, data) {
...
return deferred.promise;
}).then(function(parsedData) {
...
})
s3.getObject()
似乎是一个回调样式的API,不会返回承诺。当然,它显示为callback,但是getObject()
函数本身没有。
您需要做的是转换s3.getObject()
以返回承诺。 Node具有utils.promisify()
,它将采用回调样式的API,并返回该函数的版本,该版本将返回promise。您可能可以做到:
utils.promisify()
aws-sdk.js最初是用回调编写的,后来它们引入了promises。您只需要做的就是将const util = require('util')
const getObject = util.promisify(s3.getObject)
getObject(params)
.then(function(parsedData){
...
})
添加到.promise()
和您的固定内容中。
这里是一个例子:
getObject