wake-up-neo.com

AWS-Lambda-Fehler: "Modul '/ var/task/index' kann nicht gefunden werden"

Node.js Alexa Aufgabe

Ich codiere derzeit eine Alexa-Aufgabe von Node.js über AWS Lambda, und ich habe versucht, eine Funktion zu codieren, die Informationen von der OpenWeather-API empfängt und in eine Variable mit dem Namen weather analysiert. Der relevante Code lautet wie folgt:

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);
}

Ich habe dieses Snippet unzählige Male in Cloud9 und anderen IDEs ausgeführt, und es scheint einwandfrei zu funktionieren. Wenn ich es jedoch in ein Paket einpacke und zu AWS Lambda hochlade, erhalte ich die folgende Fehlermeldung:

{
    "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)"
    ]
}

Ich habe unzählige Artikel durchforstet und module-js, request und viele andere Node-Module installiert, die diesen Code ausführen sollen, aber nichts scheint dieses Problem zu beheben. Hier ist mein Verzeichnis für alle Fälle:

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

Weiß jemand, woran es liegen könnte? Vielen Dank im Voraus.

72

Behoben! Mein Problem war, dass ich versuchte, die Datei mithilfe der in Finder integrierten Komprimierungsfunktion meines Mac zu komprimieren. Wenn Sie wie ich ein Mac-Benutzer sind, sollten Sie das folgende Skript in terminal ausführen, wenn Sie sich im Stammverzeichnis Ihres Projekts befinden (Ordner mit Ihren Dateien index.js, node_modules usw.).

Zip -r ../yourfilename.Zip *

Edit: Wenn Sie ein Windows-Benutzer sind, führen Sie Folgendes in der Eingabeaufforderung ( source ) aus.

compact /c "C:/fullpathtoyourfile" /i /Q
195

Aktualisieren Sie die akzeptierte Antwort: Wenn dieser Fehler auftritt, bedeutet dies, dass Ihre ZIP-Datei nicht in der gültigen Form vorliegt, die AWS benötigt.

Wenn Sie auf Zip doppelklicken, finden Sie Ihren Ordner in Ihrer Codedatei, aber Lambda möchte, dass beim Doppelklicken auf Zip direkte Codedateien angezeigt werden.  

Um das zu erreichen:

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

Laden Sie dann index.Zip zu AWS Lambda hoch.

18
Ashutosh Jha

Überprüfen Sie, ob Dateiname und Handler-Name identisch sind: 

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

Das bedeutet, dass Zip-Datei bundle.js-Datei enthält, die handler-Funktion exportiert:

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

12
zooblin

Möglicherweise handelt es sich hierbei um ein Berechtigungsproblem mit Dateien in Ihrer Implementierungs-Zip Versuchen Sie, Ihre Dateien mit chmod 777 zu packen, bevor Sie sie in eine ZIP-Datei packen.

4
spg

In meinem Fall enthielt das Archiv einen Ordner "src" mit der Datei "index.js". Daher musste ich dem Handler Folgendes hinzufügen: "src/index.handler"

 enter image description here

2

In meinem Fall lag es daran, dass ich die Handler-Datei im inneren SRC-Verzeichnis hatte.

Ich musste die 'Handler'-Eigenschaft in Lambda ändern von:

index.handler

zu

src/index.handler
1
Pete

Ich habe diesen Fehler erhalten, als ich lambci/lambda:nodejs8.10 in Windows verwendet habe.

Ich hatte alle oben aufgeführten Lösungen ausprobiert, aber keine davon konnte mir bei der Lösung meines Problems helfen (obwohl der Fehler-Stack genauso aussieht wie die Frage).

Hier ist meine einfache Lösung:

  1. verwenden Sie das Flag --entrypoint, um einen Container auszuführen und festzustellen, ob die Datei in den Container eingebunden ist. Es stellt sich heraus, dass bei meinem Docker Desktop möglicherweise ein Problem mit dem Freigabelaufwerk auftritt.
  2. Ich habe meinen Docker-Daemon am Vortag gewechselt, aber bis auf dieses Problem funktioniert alles einwandfrei.
  3. Wie auch immer, hängen Sie mein Laufwerk erneut in Docker Desktop ein. Sie können entweder den Befehl docker verwenden oder einfach die Docker Desktop-Einstellung öffnen, um sie anzuwenden.
0
Dylan L

In meinem Fall musste ich ersetzen

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

mit

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