Проблема с задачей Node.js Alexa
В настоящее время я кодирую задачу Node.js Alexa с помощью AWS Lambda, и я пытался кодировать функцию, которая получает информацию от OpenWeather API и анализирует ее в переменной с именем weather
. Соответствующий код выглядит следующим образом:
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);
}
Я запускал этот фрагмент бесчисленное количество раз в Cloud9 и других IDE, и, похоже, он работает безупречно. Однако когда я заархивирую его в пакет и загружаю в AWS Lambda, я получаю следующую ошибку:
{
"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)"
]
}
Я просмотрел бесчисленное количество статей и установил module-js, request и многие другие модули Node, которые должны запускать этот код, но, похоже, ничего не решило эту проблему. Вот мой каталог, на всякий случай:
- planyr.zip
- index.js
- node_modules
- package.json
Кто-нибудь знает, в чем может быть проблема? Огромное спасибо заранее.
источник
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
Ответы:
Починил это! Моя проблема заключалась в том, что я пытался заархивировать файл, используя встроенную функцию сжатия моего Mac в Finder.
Если вы пользователь Mac, как я, вы должны выполнить следующий скрипт в терминале , когда вы находитесь в корневой директории вашего проекта (папка , содержащих ваши
index.js
,node_modules
и т.д. файлы).Для Windows:
источник
index.js
zip -r /path/to/destination.zip /path/to/source/directory/*
. Это заархивирует содержимое каталога. Если вы хотите заархивировать и сам каталог, используйте / path / to / source / directory без *.Обновите принятый ответ: когда возникает эта ошибка, это означает, что ваш zip-файл имеет неправильную форму, которая требуется AWS.
Если вы дважды щелкните zip, вы найдете свою папку внутри этого файла кода, но лямбда хочет, чтобы при двойном щелчке на zip-архиве отображались файлы прямого кода.
Для достижения этой цели:
Затем загрузите
index.zip
в AWS Lambda.источник
Убедитесь, что имя файла и имя обработчика совпадают:
Это означает, что в этом
zip
файле естьbundle.js
файл, который экспортируетhandler
функцию:exports.handler = (event, context, callback) => {//...}
источник
В моем случае это было потому, что у меня был файл обработчика во внутреннем каталоге src.
Мне пришлось изменить свойство Handler в Lambda с:
к
источник
API
часть своего репо и использовалSend To > Compressed Folder
. Это создает zip со структуройapi/etc
, следовательно, исключение!Вероятно, это проблема с правами доступа к файлам внутри zip развертывания. Попробуйте
chmod 777
свои файлы, прежде чем упаковывать их в zip-файл.источник
planyr
безрезультатно пытался сжать папку в другой папке. Имя моего обработчика и имена основных файлов JavaScript совпадают (index
).chmod 777
это плохой совет ... это открытие разрешений на запись, чтение и выполнение. Всегда находите маршрут, по которому возникла проблема. Всегда старайтесь понять последствия для безопасности выполнения всего, что вам скажут в Интернете. Безопасность важна и по умолчанию должна быть в нашем коде.В моем случае в архиве была папка «src» с файлом index.js, поэтому мне пришлось поставить в обработчик: «src / index.handler»
источник
В моем случае пришлось заменить
exports.handler = function eventHandler (event, context) {
с участием
exports.handler = function (event, context, callback) {
источник
Я получил эту ошибку, когда использовал
lambci/lambda:nodejs8.10
в Windows.Я попробовал все решения, перечисленные выше, но ни одно из них не помогло мне решить мою проблему (хотя стек ошибок выглядит так же, как вопрос).
Вот мое простое решение:
--entrypoint
флага для запуска контейнера, чтобы узнать, смонтирован ли файл в контейнер. Оказывается, у меня может быть проблема с общим диском с моим Docker Desktop.docker
команду или просто открыть настройку Docker Desktop, чтобы применить.источник
В моем случае это было вызвано нехваткой памяти узлу. Я исправил это, добавив
--memory-size 1500
в своюaws lambda create-function ...
команду.источник