Node.js Alexa Task Issue
Ich codiere derzeit eine Node.js-Alexa-Task über AWS Lambda und habe versucht, eine Funktion zu codieren, die Informationen von der OpenWeather-API empfängt und in eine Variable namens analysiert weather
. 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 komprimiere und auf AWS Lambda hochlade, wird folgende Fehlermeldung angezeigt:
{
"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 durchsucht und Module-Js, Request und viele andere Node-Module installiert, mit denen dieser Code ausgeführt werden soll, aber nichts scheint dieses Problem zu beheben. Hier ist mein Verzeichnis, nur für den Fall:
- planyr.zip
- index.js
- node_modules
- package.json
Weiß jemand, was das Problem sein könnte? Vielen Dank im Voraus.
quelle
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
Antworten:
Behoben! Mein Problem war, dass ich versucht habe, die Datei mit der im Finder integrierten Komprimierungsfunktion meines Mac zu komprimieren.
Wenn Sie ein Mac - Benutzer, wie ich sind, sollten Sie das folgende Skript im Terminal ausgeführt , wenn Sie im Stammverzeichnis des Projekts sind (Ordner mit Ihren
index.js
,node_modules
usw. Dateien).Für Windows:
quelle
index.js
zip -r /path/to/destination.zip /path/to/source/directory/*
. Das komprimiert den Inhalt des Verzeichnisses. Wenn Sie das Verzeichnis selbst auch komprimieren möchten, verwenden Sie das Verzeichnis / path / to / source / ohne das *.Update auf 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:
Laden Sie dann
index.zip
auf AWS Lambda hoch.quelle
Überprüfen Sie, ob Dateiname und Handlername identisch sind:
Das bedeutet, dass die
zip
Datei einebundle.js
Exportfunktionhandler
hat:quelle
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:
zu
quelle
API
Teil meines Repos geklickt und verwendet habeSend To > Compressed Folder
. Dadurch entsteht ein Reißverschluss mit Strukturapi/etc
, daher die Ausnahme!Dies ist wahrscheinlich ein Berechtigungsproblem mit Dateien in Ihrer Bereitstellungs-Zip. Probieren Sie
chmod 777
Ihre Dateien aus, bevor Sie sie in eine Zip-Datei packen.quelle
planyr
Ordner in einem anderen Ordner ohne Erfolg zu komprimieren . Mein Handlername und die wichtigsten JavaScript-Dateinamen stimmen überein (index
).chmod 777
ist ein schlechter Rat ... dies eröffnet der Öffentlichkeit die Erlaubnis zum Schreiben, Lesen und Ausführen. Bitte finden Sie immer die Routenursache des Problems. Versuchen Sie immer, die Sicherheitsauswirkungen der Ausführung zu verstehen, die Ihnen jemand im Internet vorschreibt. Sicherheit ist wichtig und muss standardmäßig in unserem Code enthalten sein.In meinem Fall enthielt das Archiv einen Ordner "src" mit der Datei index.js, daher musste ich in den Handler "src / index.handler" einfügen.
quelle
In meinem Fall musste ich ersetzen
mit
quelle
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 Fehlerstapel genauso aussieht wie die Frage).
Hier ist meine einfache Lösung:
--entrypoint
flag, um einen Container auszuführen und herauszufinden, ob die Datei in den Container eingebunden ist. Es stellt sich heraus, dass ich möglicherweise ein Problem mit dem Freigabe-Laufwerk mit meinem Docker Desktop habe.docker
Befehl verwenden als auch einfach die Docker Desktop-Einstellung öffnen, um sie anzuwenden.quelle
In meinem Fall wurde dies dadurch verursacht, dass dem Knoten der Speicher ausgeht. Ich habe das behoben, indem ich
--memory-size 1500
meinemaws lambda create-function ...
Befehl hinzugefügt habe .quelle