Problème de tâche Alexa Node.js
Je suis en train de coder une tâche Alexa Node.js via AWS Lambda, et j'ai essayé de coder une fonction qui reçoit des informations de l'API OpenWeather et les analyse en une variable appelée weather
. Le code pertinent est le suivant:
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);
}
J'ai exécuté cet extrait d'innombrables fois dans Cloud9 et d'autres IDE, et il semble fonctionner parfaitement. Cependant, lorsque je le compresser dans un package et le télécharger sur AWS Lambda, j'obtiens l'erreur suivante:
{
"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)"
]
}
J'ai parcouru d'innombrables articles et installé module-js, request et de nombreux autres modules Node qui devraient faire fonctionner ce code, mais rien ne semble résoudre ce problème. Voici mon annuaire, au cas où:
- planyr.zip
- index.js
- node_modules
- package.json
Quelqu'un sait-il quel pourrait être le problème? Merci d'avance.
la source
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
Réponses:
Corrigé! Mon problème était que j'ai essayé de compresser le fichier en utilisant la fonction de compression intégrée de mon Mac dans le Finder.
Si vous êtes un utilisateur Mac, comme moi, vous devez exécuter le script suivant dans le terminal lorsque vous êtes dans le répertoire racine de votre projet (dossier contenant vos
index.js
,node_modules
fichiers , etc.).Pour les fenêtres:
la source
index.js
zip -r /path/to/destination.zip /path/to/source/directory/*
. Cela zippe le contenu du répertoire. Si vous souhaitez également compresser le répertoire lui-même, utilisez / chemin / vers / source / répertoire sans *.Mettre à jour la réponse acceptée: lorsque cette erreur se produit, cela signifie que votre fichier zip n'est pas sous la forme valide requise par AWS.
Si vous double-cliquez sur zip, vous trouverez votre dossier à l'intérieur de votre fichier de code, mais lambda veut que lorsque vous double-cliquez sur zip, il doit afficher les fichiers de code directs.
Pour y parvenir:
Ensuite, téléchargez
index.zip
sur AWS Lambda.la source
Vérifiez que le nom de fichier et le nom du gestionnaire sont identiques:
Cela signifie que ce
zip
fichier a unbundle.js
fichier qui exporte lahandler
fonction:la source
Dans mon cas, c'était parce que j'avais le fichier du gestionnaire dans le répertoire src interne.
J'ai dû changer la propriété 'Handler' dans Lambda de:
à
la source
API
partie de mon repo et que je l'utilisaisSend To > Compressed Folder
. Cela crée un zip avec structureapi/etc
, d'où l'exception!Il s'agit probablement d'un problème d'autorisations avec des fichiers dans votre zip de déploiement. Essayez
chmod 777
vos fichiers avant de les emballer dans un fichier zip.la source
planyr
dossier dans un autre dossier en vain. Mon nom de gestionnaire et les noms de fichiers JavaScript principaux correspondent (index
).chmod 777
est un mauvais conseil ... cela ouvre des autorisations au public pour écrire, lire et exécuter. Veuillez toujours trouver la cause de l'itinéraire du problème. Essayez toujours de comprendre les implications pour la sécurité de l'exécution de tout ce que quelqu'un sur Internet vous demande de faire. La sécurité est importante et doit être dans notre code par défaut.Dans mon cas, l'archive contenait un dossier "src" avec un fichier index.js, j'ai donc dû mettre au gestionnaire: "src / index.handler"
la source
Dans mon cas, j'ai dû remplacer
avec
la source
J'ai eu cette erreur lorsque j'utilisais
lambci/lambda:nodejs8.10
dans Windows.J'avais essayé toutes les solutions énumérées ci-dessus, mais aucune d'entre elles ne pouvait m'aider à résoudre mon problème (même si la pile d'erreurs ressemble à la question).
Voici ma solution simple:
--entrypoint
indicateur pour exécuter un conteneur afin de savoir si le fichier est monté dans le conteneur. Il s'avère que je peux avoir le problème du lecteur de partage avec mon Docker Desktop.docker
commande ou simplement ouvrir le paramètre Docker Desktop à appliquer.la source
Dans mon cas, cela a été causé par le manque de mémoire de Node. J'ai corrigé cela en ajoutant
--memory-size 1500
à maaws lambda create-function ...
commande.la source