Kesalahan AWS Lambda: “Tidak dapat menemukan modul '/ var / task / index'”

87

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.

Anthony Krivonos
sumber
Berikut adalah keluaran log untuk kode saya: 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
Anthony Krivonos
3
Selain jawaban tentang zipping menggunakan terminal di Mac, pastikan juga file kode Anda disebut 'index.js'. Nama saya memiliki nama yang lebih deskriptif, menghasilkan kesalahan.
Seni
1
@Art Ini adalah masalah saya. Saya zip test.js dan itu membuat kesalahan yang tidak tertangani. Setelah mengubahnya menjadi index.js, itu berfungsi dengan baik. Terima kasih.
Hudspeth

Jawaban:

229

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).

zip -r ../yourfilename.zip *

Untuk Windows:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip
Anthony Krivonos
sumber
7
saya melakukan zip seperti ini: "zip -r folder folder.zip" dan tentu saja ini gagal. terima kasih atas tip untuk hanya membuat zip file dan bukan direktori
Dane Macaulay
6
Bagaimana dengan windows?
Alok Rajasukumaran
juga pastikan untuk menamai fungsinyaindex.js
Pengetahuan
Apakah ada cara untuk melakukan ini dari luar direktori?
andrhamm
1
@rhmhhh Formatnya adalah 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 *.
Qaz
23

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:

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

Kemudian, unggah index.zipke AWS Lambda.

Ashutosh Jha
sumber
di windows git bast melempar kesalahan "perintah tidak ditemukan", bagaimana mengatasi ide ini?
Pardeep Jain
1
Ini adalah perintah Ubuntu, silakan google untuk windows atau cara membuat zip dari command prompt
Ashutosh Jha
20

Periksa apakah nama file dan nama penangan sama:

Dalam hal ini kami berharap bahwa semua kode kami akan ada dalam file <code> bundle.ls </code>

Itu berarti zipfile tersebut memiliki bundle.jsfile yang mengekspor handlerfungsi:

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

Dalam kasus saya itu karena saya memiliki file handler di direktori src dalam.

Saya harus mengubah properti 'Handler' dalam Lambda dari:

index.handler

untuk

src/index.handler
Pete
sumber
Saya juga berlari ke ini; [Windows] hanya saja saya mengklik kanan pada APIbagian repo saya dan menggunakan Send To > Compressed Folder. Ini menciptakan zip dengan struktur api/etc, oleh karena itu pengecualian!
C Bauer
3

Ini mungkin masalah izin dengan file di dalam zip penerapan Anda. Coba chmod 777file Anda sebelum mengemasnya dalam file zip.

spg
sumber
2
Sayangnya, hal itu sepertinya tidak menyelesaikan masalah. Saya mencoba mengompresi planyrfolder di dalam folder lain tetapi tidak berhasil. Nama penangan saya dan nama file JavaScript utama cocok ( index).
Anthony Krivonos
chmod 777adalah 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.
Exadra37
3

Dalam kasus saya, arsip tersebut berisi folder "src" dengan file index.js, jadi saya harus meletakkannya di handler: "src / index.handler"

masukkan deskripsi gambar di sini

Sergey Smolnikov
sumber
0

Dalam kasus saya, saya harus mengganti

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

dengan

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

Saya mendapat kesalahan ini ketika saya menggunakan lambci/lambda:nodejs8.10di 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:

  1. menggunakan --entrypointbendera untuk menjalankan wadah untuk mengetahui apakah file dipasang ke dalam wadah. Ternyata saya mungkin mendapat masalah drive berbagi dengan Desktop Docker saya.
  2. Saya mengganti daemon buruh pelabuhan saya hari itu sebelumnya, tetapi semuanya berfungsi dengan baik kecuali masalah ini.
  3. Bagaimanapun, pasang kembali drive saya ke Docker Desktop, Anda berdua dapat menggunakan dockerperintah atau cukup buka pengaturan Docker Desktop untuk menerapkan.
James
sumber
0

Dalam kasus saya, ini disebabkan oleh Node kehabisan memori. Saya memperbaikinya dengan menambahkan --memory-size 1500ke aws lambda create-function ...perintah saya .

Samuli Pahaoja
sumber