Masalah Tugas Alexa Node.js
Saat ini saya mengkodekan Node.js Alexa Task melalui AWS Lambda, dan saya telah mencoba membuat kode fungsi yang menerima informasi dari OpenWeather API dan menguraikannya menjadi variabel yang disebut weather
. Kode yang relevan adalah sebagai berikut:
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);
}
Saya menjalankan cuplikan ini berkali-kali di Cloud9 dan IDE lainnya, dan tampaknya berfungsi dengan sempurna. Namun, ketika saya memasukkannya ke dalam paket dan mengunggahnya ke AWS Lambda, saya mendapatkan kesalahan berikut:
{
"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)"
]
}
Saya menjelajahi artikel yang tak terhitung jumlahnya dan menginstal module-js, request, dan banyak modul Node lainnya yang seharusnya membuat kode ini berjalan, tetapi sepertinya tidak ada yang memperbaiki masalah ini. Ini direktori saya, untuk berjaga-jaga:
- planyr.zip
- index.js
- node_modules
- package.json
Adakah yang tahu apa masalahnya? Terima kasih banyak sebelumnya.
sumber
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
Jawaban:
Diperbaiki! Masalah saya adalah saya mencoba mengompresi file menggunakan fungsi kompresi bawaan Mac saya di Finder.
Jika Anda pengguna Mac, seperti saya, Anda harus menjalankan script berikut di terminal ketika Anda berada di direktori root proyek Anda (folder yang berisi Anda
index.js
,node_modules
, dll file).Untuk Windows:
sumber
index.js
zip -r /path/to/destination.zip /path/to/source/directory/*
. Itu membuat zip isi direktori. Jika Anda juga ingin meng-zip direktori itu sendiri, gunakan / path / ke / source / direktori tanpa *.Perbarui ke jawaban yang diterima: Jika kesalahan ini terjadi, itu berarti file zip Anda tidak dalam bentuk valid yang diperlukan AWS.
Jika Anda mengklik dua kali pada zip, Anda akan menemukan folder Anda di dalam file kode itu, tetapi lambda menginginkan bahwa ketika Anda mengklik dua kali pada zip, itu akan menampilkan file kode langsung.
Untuk mencapai ini:
Kemudian, unggah
index.zip
ke AWS Lambda.sumber
Periksa apakah nama file dan nama penangan sama:
Itu berarti
zip
file tersebut memilikibundle.js
file yang mengeksporhandler
fungsi:exports.handler = (event, context, callback) => {//...}
sumber
Dalam kasus saya itu karena saya memiliki file handler di direktori src dalam.
Saya harus mengubah properti 'Handler' dalam Lambda dari:
untuk
sumber
API
bagian repo saya dan menggunakanSend To > Compressed Folder
. Ini menciptakan zip dengan strukturapi/etc
, oleh karena itu pengecualian!Ini mungkin masalah izin dengan file di dalam zip penerapan Anda. Coba
chmod 777
file Anda sebelum mengemasnya dalam file zip.sumber
planyr
folder di dalam folder lain tetapi tidak berhasil. Nama penangan saya dan nama file JavaScript utama cocok (index
).chmod 777
adalah nasihat yang buruk ... ini membuka izin bagi publik untuk menulis, membaca, dan mengeksekusi. Harap selalu temukan rute penyebab masalah. Selalu mencoba untuk memahami implikasi keamanan dari mengeksekusi apa pun yang diperintahkan seseorang di internet untuk Anda lakukan. Keamanan itu penting dan harus ada dalam kode kami secara default.Dalam kasus saya, arsip tersebut berisi folder "src" dengan file index.js, jadi saya harus meletakkannya di handler: "src / index.handler"
sumber
Dalam kasus saya, saya harus mengganti
exports.handler = function eventHandler (event, context) {
dengan
exports.handler = function (event, context, callback) {
sumber
Saya mendapat kesalahan ini ketika saya menggunakan
lambci/lambda:nodejs8.10
di windows.Saya telah mencoba semua solusi yang tercantum di atas tetapi tidak ada yang dapat membantu saya menangani masalah saya (meskipun tumpukan kesalahan terlihat sama dengan pertanyaannya).
Inilah solusi sederhana saya:
--entrypoint
bendera untuk menjalankan wadah untuk mengetahui apakah file dipasang ke dalam wadah. Ternyata saya mungkin mendapat masalah drive berbagi dengan Desktop Docker saya.docker
perintah atau cukup buka pengaturan Docker Desktop untuk menerapkan.sumber
Dalam kasus saya, ini disebabkan oleh Node kehabisan memori. Saya memperbaikinya dengan menambahkan
--memory-size 1500
keaws lambda create-function ...
perintah saya .sumber