Подтвердить что ты не робот

Ошибка AWS Lambda: "Не удается найти модуль" /var/task/index "

Node.js Задача Alexa Task

Я сейчас кодирую Node.js Alexa Task через AWS Lambda, и я пытаюсь закодировать функцию, которая получает информацию из API OpenWeather и анализирует ее в переменной с именем weather. Соответствующий код выглядит следующим образом:

var request = require('request');
var weather = "";
function isBadWeather(location) {
      var endpoint = "http://api.openweathermap.org/data/2.5/weather?q=" + location + "&APPID=205283d9c9211b776d3580d5de5d6338";
      var body = "";
      request(endpoint, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                  body = JSON.parse(body);
                  weather = body.weather[0].id;
            }
      });
}

function testWeather()
{
      setTimeout(function() {
      if (weather >= 200 && weather < 800)
            weather = true;
      else
            weather = false;
      console.log(weather);
      generateResponse(buildSpeechletResponse(weather, true), {});
      }, 500);
}

Я использовал этот фрагмент бесчисленных раз в Cloud9 и других IDE, и, похоже, он работает безупречно. Однако, когда я застегиваю его в пакет и загружаю его в AWS Lambda, я получаю следующую ошибку:

{
    "errorMessage": "Cannot find module '/var/task/index'",
    "errorType": "Error",
    "stackTrace": [
        "Function.Module._load (module.js:276:25)",
        "Module.require (module.js:353:17)",
        "require (internal/module.js:12:17)"
    ]
}

Я просмотрел бесчисленные статьи и установил модули-js, запрос и многие другие Node модули, которые должны сделать этот код запущенным, но ничего не исправляет эту проблему. Вот мой каталог, на всякий случай:

- planyr.zip
   - index.js
   - node_modules
   - package.json

Кто-нибудь знает, в чем проблема? Большое вам спасибо заранее.

4b9b3361

Ответ 1

Починил это! Моя проблема заключалась в том, что я пытался сжать файл, используя встроенную в Mac функцию сжатия в Finder.

Если вы пользователь Mac, как и я, вам следует запустить следующий скрипт в терминале, когда вы находитесь в корневом каталоге вашего проекта (папка, содержащая ваши index.js, node_modules и т.д.).

zip -r ../yourfilename.zip *

Для Windows:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip

Ответ 2

Обновить принятый ответ: При возникновении этой ошибки ваш zip файл не находится в допустимой форме, которую требует AWS.

Если вы дважды щелкните по zip, вы найдете свою папку внутри этого файла кода, но lambda хочет, чтобы при двойном щелчке по zip он отображал прямые файлы кода.

Чтобы достичь этого:

open terminal  
cd your-lambda-folder 
zip -r index.zip *

Затем загрузите index.zip в AWS Lambda.

Ответ 3

Убедитесь, что имя файла и имя обработчика совпадают:

In this case we expect that all our code will be in <code>bundle.ls</code> file

Это означает, что в zip файле есть файл bundle.js который экспортирует функцию- handler:

exports.handler = (event, context, callback) => {//...}

Ответ 4

Вероятно, это проблема с правами на доступ к файлам внутри вашего развертывания zip. Попробуйте chmod 777 ваши файлы перед их упаковкой в ​​zip файле.

Ответ 5

В моем случае это было потому, что у меня был файл обработчика во внутренней директории src.

Мне пришлось изменить свойство "Обработчик" в Lambda с:

index.handler

в

src/index.handler

Ответ 6

В моем случае архив содержал папку "src" с файлом index.js, поэтому мне пришлось добавить в обработчик: "src/index.handler"

enter image description here

Ответ 7

В моем случае мне пришлось заменить

exports.handler = function eventHandler (event, context) {

с

exports.handler = function (event, context, callback) {

Ответ 8

Я получил эту ошибку, когда я использовал lambci/lambda:nodejs8.10 в Windows.

Я перепробовал все решения, перечисленные выше, но ни одно из них не могло помочь мне справиться с моей проблемой (хотя стек ошибок выглядит так же, как и вопрос).

Вот мое простое решение:

  1. используя флаг --entrypoint для запуска контейнера, чтобы выяснить, монтируется ли файл в контейнер. Возможно, у меня проблема с общим диском на моем рабочем столе Docker.
  2. В тот день я переключил свой демон-докер, но все работает нормально, кроме этой проблемы.
  3. В любом случае, перемонтируйте мой диск в Docker Desktop, вы можете использовать команду docker или просто открыть настройку Docker Desktop для применения.