Problema de tarea de Node.js Alexa
Actualmente estoy codificando una tarea Node.js Alexa a través de AWS Lambda, y he estado intentando codificar una función que recibe información de la API de OpenWeather y la analiza en una variable llamada weather
. El código relevante es el siguiente:
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);
}
Ejecuté este fragmento innumerables veces en Cloud9 y otros IDE, y parece que funciona perfectamente. Sin embargo, cuando lo comprimo en un paquete y lo subo a AWS Lambda, aparece el siguiente error:
{
"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)"
]
}
Revisé innumerables artículos e instalé module-js, request y muchos otros módulos de Node que deberían hacer que este código se ejecute, pero nada parece solucionar este problema. Aquí está mi directorio, por si acaso:
- planyr.zip
- index.js
- node_modules
- package.json
¿Alguien sabe cuál podría ser el problema? Muchas gracias de antemano.
fuente
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
Respuestas:
¡Arreglado! Mi problema fue que intenté comprimir el archivo usando la función de compresión incorporada de mi Mac en Finder.
Si usted es un usuario de Mac, como yo, se debe ejecutar la siguiente secuencia de comandos en el terminal cuando se encuentra en el directorio raíz del proyecto (carpeta que contiene
index.js
,node_modules
, etc. archivos).Para ventanas:
fuente
index.js
zip -r /path/to/destination.zip /path/to/source/directory/*
. Eso comprime el contenido del directorio. Si también desea comprimir el directorio en sí, use / ruta / a / fuente / directorio sin el *.Actualizar a la respuesta aceptada: cuando se produce este error, significa que su archivo zip no tiene el formato válido que requiere AWS.
Si hace doble clic en zip, encontrará su carpeta dentro de su archivo de código, pero lambda quiere que cuando haga doble clic en zip, muestre los archivos de código directo.
Lograr esto:
Luego, cárguelo
index.zip
en AWS Lambda.fuente
Compruebe que el nombre del archivo y el nombre del controlador sean los mismos:
Eso significa que el
zip
archivo tiene unbundle.js
archivo que exporta lahandler
función:exports.handler = (event, context, callback) => {//...}
fuente
En mi caso, fue porque tenía el archivo del controlador en el directorio src interno.
Tuve que cambiar la propiedad 'Handler' dentro de Lambda de:
a
fuente
API
parte de mi repositorio y usandoSend To > Compressed Folder
. Esto crea un zip con estructuraapi/etc
, ¡de ahí la excepción!Probablemente se trate de un problema de permisos con archivos dentro de su zip de implementación. Pruebe
chmod 777
sus archivos antes de empaquetarlos en un archivo zip.fuente
planyr
carpeta dentro de otra carpeta sin éxito. El nombre de mi controlador y los nombres de los archivos JavaScript principales coinciden (index
).chmod 777
Es un mal consejo ... esto es abrir permisos al público para escribir, leer y ejecutar. Busque siempre la ruta que causa el problema. Siempre intente comprender las implicaciones de seguridad de ejecutar cualquier cosa que alguien en Internet le diga que haga. La seguridad es importante y debe estar en nuestro código por defecto.En mi caso, el archivo contenía una carpeta "src" con el archivo index.js, así que tuve que poner en el controlador: "src / index.handler"
fuente
En mi caso tuve que reemplazar
exports.handler = function eventHandler (event, context) {
con
exports.handler = function (event, context, callback) {
fuente
Recibí este error cuando estaba usando
lambci/lambda:nodejs8.10
Windows.Probé todas las soluciones enumeradas anteriormente, pero ninguna de las cuales pudo ayudarme a resolver mi problema (aunque la pila de errores se ve igual que la pregunta).
Aquí está mi solución simple:
--entrypoint
flag para ejecutar un contenedor para averiguar si el archivo está montado en el contenedor. Resulta que puedo tener el problema de la unidad compartida con mi Docker Desktop.docker
comando o simplemente abrir la configuración de Docker Desktop para aplicar.fuente
En mi caso, esto se debió a que Node se quedó sin memoria. Lo arreglé agregando
--memory-size 1500
a miaws lambda create-function ...
comando.fuente