如何解决Javascript错误';。那么这不是一个函数';?

如何解决Javascript错误';。那么这不是一个函数';?,javascript,node.js,angularjs,callback,Javascript,Node.js,Angularjs,Callback,下面的代码从S3获取csv数据并将其转换为JSON。 我得到了。那么在以下方面不是函数错误。可能的问题是什么 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);

下面的代码从S3获取csv数据并将其转换为JSON。 我得到了
。那么在以下方面不是函数
错误。可能的问题是什么

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()
似乎是一个不返回承诺的回调式API。当然,它的回调似乎是,但函数本身却不是

您需要做的是转换
s3.getObject()
以返回承诺。节点具有,它将接受回调样式的API并返回该函数的一个版本,该版本将返回一个承诺。您可能可以:

const util = require('util')

const getObject = util.promisify(s3.getObject)

getObject(params)
  .then(function(parsedData){
    ...
  })

aws-sdk.js最初是用回调编写的,后来它们引入了承诺。 您只需将
.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);
})

如果将回调函数传递给
s3.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);
})