从s3读取数据:s3.getObject不是函数

时间:2019-01-23 10:36:22

标签: alexa-skills-kit

    我正在尝试从S3读取txt文件以为Alexa建立响应。在Lambda中测试代码时,出现此错误。谁能看到我要去哪里错了?

    错误

const address = {
  city: {
    type: String,
    required: true,
    maxlength: 25
  }
  country: {
    type: String,
    required: true,
    maxlength: 25
  }
 postalcode: {
    type: String,
    required: true,
    maxlength: 9
  }
}

    我已经安装了“ aws-sdk”,并在我的技能的index.js顶部需要该模块

Error handled: s3.getObject is not a function

    处理程序代码。为了强调这一点,我正在使用Async / Await并在下面的goGetS3函数中返回Promise。

const s3 = require('aws-sdk/clients/s3')

    goGetS3()函数代码。我尝试了两个不同的版本,都给了我上面相同的错误。

const ChooseStoryIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
      handlerInput.requestEnvelope.request.intent.name === 'ChooseStoryIntent';
  },
  async handle(handlerInput) {
    let speechText;
    let options = {
      "Bucket": "stores",
      "Key": "person.txt"
    }
    await goGetS3(options)
      .then((response) => {
        console.log(response),
        console.log(response.Body.toString()),
          speechText = response
      })
      .catch((err) => {
        console.log(err)
        speechText = 'something wrong getting the story'
      })
    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .getResponse();
  },
};

    我的代码来自以下博客/文章。

####编辑###

根据@ milan-cermak,我将其添加到页面顶部

const goGetS3 = function (options) {
    s3.getObject(options, function (err, data) {
      //handle error
      if (err) {
        reject("Error", err);
      }
      //success
      if (data) {
        resolve(data.Body.toString())
      }
    }).promise()
}
// const goGetS3 = function (options) {
//   return new Promise((resolve, reject) => {
//     s3.getObject(options, function (err, data) {
//       //handle error
//       if (err) {
//         reject("Error", err);
//       }
//       //success
//       if (data) {
//         resolve(data.Body.toString())
//       }
//     })
//   })
// }

但现在出现此错误

const AWS = require('aws-sdk/clients/s3')
const s3 = new AWS.S3()

2 个答案:

答案 0 :(得分:0)

代码中的s3不是S3客户端的实例,而只是模块。您需要先创建一个新的客户端实例。

const S3 = require('aws-sdk/clients/s3');
const s3 = new S3();

// you can now do s3.getObject

答案 1 :(得分:0)

要使其正常工作,我必须进行更改

const AWS = require('aws-sdk/clients/s3')
const s3 = new AWS.S3()

const AWS = require('aws-sdk')
const s3 = new AWS.S3()

我很想知道为什么我需要导入整个AWS开发工具包才能使其正常工作。