Чтение данных из s3: s3.getObject не является функцией - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь прочитать текстовый файл из S3, чтобы создать ответ для Alexa.При тестировании кода в Lambda я получаю эту ошибку.Кто-нибудь может увидеть, где я иду не так?

Ошибка

Error handled: s3.getObject is not a function

Я установил 'aws-sdk' и мне потребовался модуль вверху index.js моего навыка index.js

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

Код обработчика.Чтобы подчеркнуть это, я использую Async / Await и возвращаю Promise в функции 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();
  },
};

Код функции goGetS3 ().Я попробовал две разные версии, обе выдают мне ту же ошибку выше.

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())
//       }
//     })
//   })
// }

Мой код собран из следующих блогов / статей.

#### EDIT ###

В соответствии с @ milan-cermak я добавил это вверху страницы

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

но теперь получите эту ошибку

module initialization error: TypeError 
at Object.<anonymous> (/var/task/index.js:6:12) 
at Module._compile (module.js:652:30) 
at Object.Module._extensions..js (module.js:663:10) 
at Module.load (module.js:565:32) 
at tryModuleLoad (module.js:505:12) 
at Function.Module._load (module.js:497:3) 
at Module.require (module.js:596:17) 
at require (internal/module.js:11:18)

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Чтобы заставить это работать, мне пришлось изменить

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

на

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

Мне бы очень хотелось знать, почему мне нужно было импортировать весь AWS SDK, чтобы получить эторабота ..

0 голосов
/ 23 января 2019

s3 в вашем коде - это не экземпляр клиента S3, а просто модуль. Сначала нужно создать новый экземпляр клиента.

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

// you can now do s3.getObject
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...