以下代码是从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);
});
}
答案 0 :(得分:0)
s3.getObject(params, function (err, data) {
...
return deferred.promise;
}).then(function(parsedData) {
...
})
s3.getObject()
似乎是一种回调样式的API,不会返回承诺。当然,它看起来是回调,但是getObject()
函数本身却没有。
您需要做的是转换s3.getObject()
以返回承诺。 Node具有utils.promisify()
,它将使用回调样式的API并返回该函数的版本,该版本返回promise。您可能可以做到:
const util = require('util')
const getObject = util.promisify(s3.getObject)
getObject(params)
.then(function(parsedData){
...
})
答案 1 :(得分:0)
aws-sdk.js最初是用回调编写的,后来又引入了promises。
您只需要做的是将.promise()
添加到您的getObject
和您的固定电话中。
这里是一个例子:
s3
.getObject(params)
.promise()
.then(data => {
const csv = data.Body.toString('utf-8');
const headers = 'id,start,end,count';
const parsed = Papa.parse(headers + '\n' + csv, parseOptions);
return parsed.data
})
.catch(err => {
console.log(err, err.stack);
})