Errore AWS Lambda: "Impossibile trovare il modulo '/ var / task / index'"


87

Problema con l'attività Alexa di Node.js

Attualmente sto codificando un'attività Alexa Node.js tramite AWS Lambda e sto provando a codificare una funzione che riceve informazioni dall'API OpenWeather e le analizza in una variabile chiamata weather. Il codice pertinente è il seguente:

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);
}

Ho eseguito questo snippet innumerevoli volte in Cloud9 e altri IDE e sembra funzionare perfettamente. Tuttavia, quando lo comprimo in un pacchetto e lo carico su AWS Lambda, ottengo il seguente errore:

{
    "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)"
    ]
}

Ho setacciato innumerevoli articoli e installato module-js, request e molti altri moduli Node che dovrebbero far funzionare questo codice, ma nulla sembra risolvere questo problema. Ecco la mia directory, per ogni evenienza:

- planyr.zip
   - index.js
   - node_modules
   - package.json

Qualcuno sa quale potrebbe essere il problema? Grazie mille in anticipo.


Ecco l'output del log per il mio codice: 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
Oltre alla risposta sulla compressione tramite il terminale su un Mac, assicurati anche che il tuo file di codice si chiami "index.js". Il mio aveva un nome più descrittivo, generando l'errore.
Arte

1
@Art Questo era il mio problema. Ho zippato un test.js e ha generato un errore non gestito. Dopo averlo modificato in index.js ha funzionato bene. Grazie.
Hudspeth

Risposte:


229

Aggiustato! Il mio problema era che ho provato a comprimere il file utilizzando la funzione di compressione integrata del mio Mac nel Finder.

Se sei un utente Mac, come me, si dovrebbe eseguire il seguente script nel terminale quando ci si trova nella directory principale del progetto (cartella contenente i index.js, node_modulesfile, ecc).

zip -r ../yourfilename.zip *

Per Windows:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip

7
Stavo zippando in questo modo: "zip -r folder folder.zip" e ovviamente non è riuscito. grazie per il suggerimento di comprimere solo i file e non la directory
Dane Macaulay

6
Che ne dici di Windows?
Alok Rajasukumaran

assicurati inoltre di assegnare un nome alla funzioneindex.js
Conoscenza

C'è un modo per farlo dall'esterno della directory?
andrhamm

1
@andrhamm Sì. Il formato è zip -r /path/to/destination.zip /path/to/source/directory/*. Questo chiude il contenuto della directory. Se vuoi comprimere anche la directory stessa, usa / path / to / source / directory senza *.
Qaz

23

Aggiorna alla risposta accettata: quando si verifica questo errore, significa che il tuo file zip non è nella forma valida richiesta da AWS.

Se fai doppio clic su zip troverai la tua cartella all'interno del file di codice, ma lambda vuole che quando fai doppio clic su zip mostri i file di codice diretti.

Per realizzare questo:

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

Quindi, carica index.zipin AWS Lambda.


in windows git bast lanciare l'errore "comando non trovato", come risolvere questa idea?
Pardeep Jain

1
Questo è il comando di Ubuntu, per favore google per Windows o come creare zip dal prompt dei comandi
Ashutosh Jha

20

Verifica che il nome del file e il nome del gestore siano gli stessi:

In questo caso ci aspettiamo che tutto il nostro codice sia nel file <code> bundle.ls </code>

Ciò significa che il zipfile ha un bundle.jsfile che esporta la handlerfunzione:

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

4

Nel mio caso era perché avevo il file del gestore nella directory src interna.

Ho dovuto modificare la proprietà 'Handler' all'interno di Lambda da:

index.handler

per

src/index.handler

Mi sono imbattuto anche in questo; [Windows] era semplicemente che stavo facendo clic con il pulsante destro del mouse su una APIparte del mio repository e lo utilizzavo Send To > Compressed Folder. Questo crea una zip con struttura api/etc, da qui l'eccezione!
C Bauer

3

Questo è probabilmente un problema di autorizzazioni con i file all'interno dello zip di distribuzione. Prova i chmod 777tuoi file prima di impacchettarli in un file zip.


2
Sfortunatamente, ciò non sembra risolvere il problema. Ho provato a comprimere la planyrcartella all'interno di un'altra cartella senza alcun risultato. Il nome del mio gestore e i nomi dei file JavaScript principali corrispondono ( index).
Anthony Krivonos

chmod 777è un cattivo consiglio ... questo è aprire i permessi al pubblico per scrivere, leggere ed eseguire. Trova sempre la causa del problema. Cerca sempre di comprendere le implicazioni per la sicurezza dell'esecuzione di qualsiasi cosa qualcuno in Internet ti dica di fare. La sicurezza è importante e deve essere inclusa nel nostro codice per impostazione predefinita.
Exadra37

3

Nel mio caso l'archivio conteneva una cartella "src" con il file index.js, quindi ho dovuto mettere al gestore: "src / index.handler"

inserisci qui la descrizione dell'immagine


0

Nel mio caso ho dovuto sostituire

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

con

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

0

Ho ricevuto questo errore quando stavo usando lambci/lambda:nodejs8.10in Windows.

Avevo provato tutte le soluzioni elencate sopra, ma nessuna delle quali poteva aiutarmi ad affrontare il mio problema (anche se lo stack degli errori sembra lo stesso della domanda).

Ecco la mia semplice soluzione:

  1. utilizzando --entrypointflag per eseguire un contenitore per scoprire se il file è montato nel contenitore. Risulta che potrei avere il problema di condivisione dell'unità con il mio desktop Docker.
  2. Ho cambiato il mio daemon docker quel giorno prima, ma tutto funziona bene tranne questo problema.
  3. Ad ogni modo, rimonta la mia unità su Docker Desktop, puoi entrambi utilizzare il dockercomando o semplicemente aprire l'impostazione Docker Desktop da applicare.

0

Nel mio caso, ciò è stato causato dall'esaurimento della memoria del nodo. L'ho risolto aggiungendo --memory-size 1500al mio aws lambda create-function ...comando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.