Problem z zadaniem Alexa Node.js
Obecnie koduję zadanie Node.js Alexa za pośrednictwem AWS Lambda i próbuję zakodować funkcję, która odbiera informacje z interfejsu API OpenWeather i analizuje je na zmienną o nazwie weather
. Odpowiedni kod jest następujący:
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);
}
Uruchomiłem ten fragment niezliczoną ilość razy w Cloud9 i innych IDE i wydaje się, że działa bezbłędnie. Jednak gdy spakuję go do pakietu i wgram do AWS Lambda, pojawia się następujący błąd:
{
"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)"
]
}
Przejrzałem niezliczone artykuły i zainstalowałem module-js, request i wiele innych modułów Node, które powinny spowodować uruchomienie tego kodu, ale wydaje się, że nic nie rozwiązuje tego problemu. Oto mój katalog, na wszelki wypadek:
- planyr.zip
- index.js
- node_modules
- package.json
Czy ktoś wie, na czym może polegać problem? Z góry bardzo dziękuję.
źródło
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
Odpowiedzi:
Naprawione! Mój problem polegał na tym, że próbowałem spakować plik za pomocą wbudowanej funkcji kompresji mojego Maca w Finderze.
Jeśli jesteś użytkownikiem Mac, jak ja, należy uruchomić następujący skrypt w terminalu, gdy jesteś w głównym katalogu projektu (folder zawierający
index.js
,node_modules
itd plików).Dla Windowsa:
źródło
index.js
zip -r /path/to/destination.zip /path/to/source/directory/*
. To spakuje zawartość katalogu. Jeśli chcesz również spakować sam katalog, użyj / path / to / source / katalog bez *.Zaktualizuj zaakceptowaną odpowiedź: gdy wystąpi ten błąd, oznacza to, że plik zip nie jest w prawidłowej formie, której wymaga AWS.
Jeśli klikniesz dwukrotnie na zip, znajdziesz swój folder w tym pliku z kodem, ale lambda chce, aby po dwukrotnym kliknięciu zip pokazywał bezpośrednie pliki z kodem.
Osiągnąć to:
Następnie prześlij
index.zip
do AWS Lambda.źródło
Sprawdź, czy nazwa pliku i nazwa programu obsługi są takie same:
Oznacza to, że
zip
plik mabundle.js
plik eksportującyhandler
funkcję:exports.handler = (event, context, callback) => {//...}
źródło
W moim przypadku było tak, ponieważ miałem plik obsługi w wewnętrznym katalogu src.
Musiałem zmienić właściwość „Handler” w Lambdzie z:
do
źródło
API
część mojego repozytorium i używałemSend To > Compressed Folder
. To tworzy zamek ze strukturąapi/etc
, stąd wyjątek!Prawdopodobnie jest to problem z uprawnieniami do plików w pliku ZIP wdrożenia. Wypróbuj
chmod 777
pliki przed zapakowaniem ich w plik zip.źródło
planyr
folder w innym folderze bezskutecznie. Nazwa mojego programu obsługi i nazwy głównych plików JavaScript są zgodne (index
).chmod 777
to zła rada ... to jest publiczne udostępnienie uprawnień do zapisu, odczytu i wykonywania. Zawsze znajdź przyczynę problemu z trasą. Zawsze staraj się zrozumieć implikacje bezpieczeństwa wynikające z wykonywania czegokolwiek, co ktoś w internecie poleci ci zrobić. Bezpieczeństwo jest ważne i domyślnie musi znajdować się w naszym kodzie.W moim przypadku archiwum zawierało folder "src" z plikiem index.js, więc musiałem wstawić do handlera: "src / index.handler"
źródło
W moim przypadku musiałem wymienić
exports.handler = function eventHandler (event, context) {
z
exports.handler = function (event, context, callback) {
źródło
Otrzymałem ten błąd, gdy używałem
lambci/lambda:nodejs8.10
w systemie Windows.Wypróbowałem wszystkie wymienione powyżej rozwiązania, ale żadne z nich nie pomogło mi rozwiązać mojego problemu (mimo że stos błędów wygląda tak samo jak pytanie).
Oto moje proste rozwiązanie:
--entrypoint
flagi do uruchomienia kontenera, aby dowiedzieć się, czy plik jest zamontowany w kontenerze. Okazuje się, że mogę mieć problem z udostępnionym dyskiem na moim pulpicie Docker.docker
polecenia, jak i po prostu otworzyć ustawienie Docker Desktop, aby zastosować.źródło
W moim przypadku było to spowodowane brakiem pamięci w Node. Naprawiłem to, dodając
--memory-size 1500
do mojegoaws lambda create-function ...
polecenia.źródło