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.
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
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.
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.
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
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:
--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.docker
verwenden oder einfach die Docker Desktop-Einstellung öffnen, um sie anzuwenden.In meinem Fall musste ich ersetzen
exports.handler = function eventHandler (event, context) {
mit
exports.handler = function (event, context, callback) {