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


узел.вопрос задачи на JS Алекса

в настоящее время я кодирую узел.задача JS Alexa через 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, запрос и многие другие модули узлов, которые должны заставить этот код работать, но ничего не исправляет эту проблему. Вот мой каталог, на всякий случай:

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

кто-нибудь знает, в чем проблема может быть? Заранее большое вам спасибо.

6 63

6 ответов:

исправил! Проблема заключалась в том, чтобы попытаться застегнуть его, используя программное обеспечение для сжатия моего Mac. Вам лучше запустить следующий код в терминале, когда вы находитесь в каталоге, содержащем ваш индекс.js, node_modules и др. файлы.

zip -r ../yourfilename.zip *

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

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

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

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

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

проверьте, что имя файла и имя обработчика такие же:

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

что это значит и bundle.js файл, который экспортирует handler функция:

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

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

в моем случае я должен был заменить

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

С

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

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

enter image description here