Problema de tarefa Alexa em Node.js
Atualmente, estou codificando uma tarefa Alexa em Node.js por meio do AWS Lambda e venho tentando codificar uma função que recebe informações da API OpenWeather e as analisa em uma variável chamada weather
. O código relevante é o seguinte:
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);
}
Eu executei este snippet inúmeras vezes no Cloud9 e em outros IDEs, e parece estar funcionando perfeitamente. No entanto, ao compactar em um pacote e carregá-lo no AWS Lambda, recebo o seguinte erro:
{
"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)"
]
}
Eu vasculhei incontáveis artigos e instalei module-js, request e muitos outros módulos do Node que deveriam fazer este código rodar, mas nada parece resolver esse problema. Aqui está meu diretório, apenas no caso:
- planyr.zip
- index.js
- node_modules
- package.json
Alguém sabe qual pode ser o problema? Muito obrigado antecipadamente.
fonte
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
Respostas:
Corrigido! Meu problema foi que tentei compactar o arquivo usando a função de compactação embutida do meu Mac no Finder.
Se você é um usuário de Mac, como eu, você deve executar o seguinte script no terminal quando você está no diretório raiz do seu projeto (pasta que contém seus
index.js
,node_modules
, etc arquivos).Para Windows:
fonte
index.js
zip -r /path/to/destination.zip /path/to/source/directory/*
. Isso compacta o conteúdo do diretório. Se você deseja compactar o próprio diretório também, use / path / para / source / diretório sem o *.Atualize para a resposta aceita: Quando esse erro ocorre, significa que seu arquivo zip não está no formato válido que a AWS exige.
Se você clicar duas vezes no zip, encontrará sua pasta dentro do seu arquivo de código, mas lambda quer isso quando você clicar duas vezes no zip, ele deve mostrar os arquivos de código direto.
Para alcançar isto:
Em seguida, carregue
index.zip
no AWS Lambda.fonte
Verifique se o nome do arquivo e o nome do manipulador são iguais:
Isso significa que esse
zip
arquivo possui umbundle.js
arquivo que exporta ahandler
função:fonte
No meu caso, foi porque eu tinha o arquivo manipulador no diretório interno src.
Tive que alterar a propriedade 'Handler' no Lambda de:
para
fonte
API
parte do meu repositório e usandoSend To > Compressed Folder
. Isso cria um zip com estruturaapi/etc
, daí a exceção!Este é provavelmente um problema de permissão com arquivos dentro de seu zip de implantação. Teste
chmod 777
seus arquivos antes de compactá-los em um arquivo zip.fonte
planyr
pasta em outra pasta, sem sucesso. Meu nome de manipulador e os nomes dos arquivos principais do JavaScript correspondem (index
).chmod 777
é um conselho ruim ... isso é abrir as permissões para o público escrever, ler e executar. Sempre encontre a causa do problema. Sempre tente entender as implicações de segurança de executar qualquer coisa que alguém na Internet diga para você fazer. A segurança é importante e deve estar em nosso código por padrão.No meu caso, o arquivo continha uma pasta "src" com o arquivo index.js, então tive que colocar para o manipulador: "src / index.handler"
fonte
No meu caso tive que substituir
com
fonte
Recebi este erro quando estava usando
lambci/lambda:nodejs8.10
no windows.Eu tentei todas as soluções listadas acima, mas nenhuma delas poderia me ajudar a lidar com meu problema (embora a pilha de erros pareça a mesma da pergunta).
Aqui está minha solução simples:
--entrypoint
sinalizador para executar um contêiner para descobrir se o arquivo está montado no contêiner. Acontece que posso ter o problema de compartilhamento de unidade com meu Docker Desktop.docker
comando ou apenas abrir a configuração do Docker Desktop para aplicar.fonte
No meu caso, isso foi causado por Node ficando sem memória. Consertei isso adicionando
--memory-size 1500
ao meuaws lambda create-function ...
comando.fonte