Помилка лямбди AWS: “Не вдається знайти модуль '/ var / task / index'”


87

Випуск завдання Node.js Alexa

В даний час я кодую 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 та інших середовищах розробки, і, здається, він працює бездоганно. Однак, коли я застібаю його в пакет і завантажую в 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)"
    ]
}

Я переглянув незліченну кількість статей і встановив module-js, request та багато інших модулів Node, які мали б запустити цей код, але, здається, ніщо не вирішує цю проблему. Ось мій каталог, про всяк випадок:

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

Хтось знає, в чому може бути проблема? Щиро дякую заздалегідь.


Ось вихідні дані журналу для мого коду: START RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 Version: $LATEST Unable to import module 'index': Error at Function.Module._resolveFilename (module.js:325:15) at Function.Module._load (module.js:276:25) at Module.require (module.js:353:17) at require (internal/module.js:12:17) END RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 REPORT RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 Duration: 55.76 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 16 MB
Ентоні Кривонос,

3
На додаток до відповіді на архівування за допомогою терміналу на Mac, також переконайтесь, що ваш файл коду називається 'index.js'. Моє мало більш описове ім’я, що спричинило помилку.
Art

1
@Art Це було моє питання. Я заархівував test.js, і він видав необроблену помилку. Після зміни на index.js він працював нормально. Дякую.
Хадспет,

Відповіді:


229

Виправлено! Моя проблема полягала в тому, що я намагався заархівувати файл за допомогою вбудованої в Mac функції стиснення у Finder.

Якщо ви користувач Mac, як я, ви повинні виконати наступний скрипт в терміналі , коли ви знаходитесь в кореневій директорії вашого проекту (папка , що містять ваші index.js, node_modulesі т.д. файли).

zip -r ../yourfilename.zip *

Для Windows:

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

7
я стискав в архів так: "zip -r folder folder.zip", і, звичайно, це не вдалося. дякую за підказку просто заархівувати файли, а не каталог
Дейн Маколей

6
Як щодо вікон?
Alok Rajasukumaran

також обов’язково назвіть функціюindex.js
Знання

Чи є спосіб зробити це за межами каталогу?
andrhamm

1
@andrhamm Так. Формат zip -r /path/to/destination.zip /path/to/source/directory/*. Це зміщує вміст каталогу. Якщо ви також хочете заархівувати сам каталог, використовуйте / path / to / source / directory без *.
Каз

23

Оновіть прийняту відповідь. Коли виникає ця помилка, це означає, що ваш zip-файл не в дійсній формі, що вимагає AWS.

Якщо ви двічі клацнете на zip, ви знайдете свою папку всередині цього файлу коду, але лямбда хоче, щоб при подвійному клацанні на zip він мав відображати прямі файли коду.

Для цього:

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

Потім завантажте index.zipв AWS Lambda.


у Windows git bast кидає помилку "команду не знайдено", як вирішити цю ідею?
Пардіп Джейн

1
Це команда Ubuntu, прошу погуглити її для Windows або як створити zip з командного рядка
Ашутош Джа

20

Переконайтеся, що ім’я файлу та ім’я обробника однакові:

У цьому випадку ми очікуємо, що весь наш код буде у файлі <code> bundle.ls </code>

Це означає, що zipфайл має bundle.jsфайл, який експортує handlerфункцію:

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

4

У моєму випадку це було тому, що у мене був файл обробника у внутрішній директорії src.

Мені довелося змінити властивість 'Обробник' в Лямбді з:

index.handler

до

src/index.handler

Я теж наткнувся на це; [Windows] це було просто тим, що я клацнув правою кнопкою миші APIчастину мого репо та використовував Send To > Compressed Folder. Це створює zip зі структурою api/etc, звідси виняток!
C Bauer

3

Можливо, це проблема з дозволами для файлів у вашому архіві ZIP. Спробуйте chmod 777свої файли, перш ніж упакувати їх у zip-файл.


2
На жаль, це, здається, не вирішує проблему. Я спробував стиснути planyrпапку в іншій папці безрезультатно. Ім'я мого обробника та імена основних файлів JavaScript збігаються ( index).
Ентоні Кривонос,

chmod 777це погана порада ... це відкриття дозволів публіці писати, читати та виконувати. Завжди знаходьте причину проблеми. Завжди намагайтеся зрозуміти наслідки для безпеки, виконуючи те, що хтось в Інтернеті наказав вам зробити. Безпека є важливою і за замовчуванням повинна бути в нашому коді.
Exadra37

3

У моєму випадку архів містив папку "src" з файлом index.js, тому мені довелося помістити в обробник: "src / index.handler"

введіть тут опис зображення


0

У моєму випадку мені довелося замінити

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

з

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

0

Я отримав цю помилку, коли використовував lambci/lambda:nodejs8.10Windows.

Я спробував усі перелічені вище рішення, але жодне з них не могло б допомогти мені вирішити мою проблему (хоча стек помилок виглядає так само, як і питання).

Ось моє просте рішення:

  1. використання --entrypointпрапора для запуску контейнера, щоб з’ясувати, чи файл вмонтовано в контейнер. Виявляється, у мене може виникнути проблема спільного диска з моїм Docker Desktop.
  2. Цього дня я змінив свій демон Docker, але все працює нормально, крім цієї проблеми.
  3. У будь-якому випадку, перемонтуйте мій диск на Docker Desktop, ви можете скористатися dockerкомандою або просто відкрити налаштування Docker Desktop, щоб застосувати.

0

У моєму випадку це було викликано тим, що у Node закінчується пам'ять. Я виправив це, додавши --memory-size 1500до моєї aws lambda create-function ...команди.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.