AWS Lambda Error: "Cannot find module '/var/task/index'"
AWS Lambda Error: "Cannot find module '/var/task/index'"
Node.js Alexa 任务问题
我目前正在通过 AWS Lambda 编写一个 Node.js Alexa 任务,我一直在尝试编写一个函数,该函数从 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
有人知道问题出在哪里吗?
这可能是部署 zip 中文件的权限问题。
尝试 chmod 777
您的文件,然后再将它们打包成 zip 文件。
已修复!我的问题是我试图在 Finder 中使用 Mac 的 built-in 压缩功能来压缩文件。
如果您是 Mac 用户,像我一样,当您位于项目的根目录(包含您的 index.js
, node_modules
, 等文件).
zip -r ../yourfilename.zip *
对于Windows:
Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip
在我的例子中,我不得不更换
exports.handler = function eventHandler (event, context) {
和
exports.handler = function (event, context, callback) {
更新已接受的答案:出现此错误时,表示您的 zip 文件不是 AWS 要求的有效格式。
如果你双击 zip 你会在你的代码文件中找到你的文件夹,但是 lambda 希望当你双击 zip 时它应该显示直接代码文件。
实现这个:
open terminal
cd your-lambda-folder
zip -r index.zip *
然后,上传index.zip
到AWS Lambda。
检查文件名和处理程序名称是否相同:
这意味着 zip
文件有 bundle.js
导出 handler
函数的文件:
exports.handler = (event, context, callback) => {//...}
在我的例子中,存档包含一个文件夹 "src" 和 index.js 文件,所以我不得不向处理程序添加:"src/index.handler"
在我的例子中,这是因为我在内部 src 目录中有处理程序文件。
我必须将 Lambda 中的 'Handler' 属性 更改为:
index.handler
至
src/index.handler
我在 windows 中使用 lambci/lambda:nodejs8.10
时遇到此错误。
我已经尝试了上面列出的所有解决方案,但 none 其中可以帮助我解决我的问题(即使错误堆栈看起来与问题相同)。
这是我的简单解决方案:
- 使用
--entrypoint
标记到 运行 容器以查明文件是否已装载到容器中。事实证明,我的 Docker 桌面可能存在共享驱动器问题。
- 我在前一天更换了我的 docker 守护程序,但除此问题外一切正常。
- 无论如何,将我的驱动器重新挂载到 Docker 桌面,您可以使用
docker
命令或直接打开 Docker 桌面设置来应用。
在我的例子中,这是由节点 运行 内存不足引起的。我通过将 --memory-size 1500
添加到我的 aws lambda create-function ...
命令来解决这个问题。
Node.js Alexa 任务问题
我目前正在通过 AWS Lambda 编写一个 Node.js Alexa 任务,我一直在尝试编写一个函数,该函数从 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
有人知道问题出在哪里吗?
这可能是部署 zip 中文件的权限问题。
尝试 chmod 777
您的文件,然后再将它们打包成 zip 文件。
已修复!我的问题是我试图在 Finder 中使用 Mac 的 built-in 压缩功能来压缩文件。
如果您是 Mac 用户,像我一样,当您位于项目的根目录(包含您的 index.js
, node_modules
, 等文件).
zip -r ../yourfilename.zip *
对于Windows:
Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip
在我的例子中,我不得不更换
exports.handler = function eventHandler (event, context) {
和
exports.handler = function (event, context, callback) {
更新已接受的答案:出现此错误时,表示您的 zip 文件不是 AWS 要求的有效格式。
如果你双击 zip 你会在你的代码文件中找到你的文件夹,但是 lambda 希望当你双击 zip 时它应该显示直接代码文件。
实现这个:
open terminal
cd your-lambda-folder
zip -r index.zip *
然后,上传index.zip
到AWS Lambda。
检查文件名和处理程序名称是否相同:
这意味着 zip
文件有 bundle.js
导出 handler
函数的文件:
exports.handler = (event, context, callback) => {//...}
在我的例子中,存档包含一个文件夹 "src" 和 index.js 文件,所以我不得不向处理程序添加:"src/index.handler"
在我的例子中,这是因为我在内部 src 目录中有处理程序文件。
我必须将 Lambda 中的 'Handler' 属性 更改为:
index.handler
至
src/index.handler
我在 windows 中使用 lambci/lambda:nodejs8.10
时遇到此错误。
我已经尝试了上面列出的所有解决方案,但 none 其中可以帮助我解决我的问题(即使错误堆栈看起来与问题相同)。
这是我的简单解决方案:
- 使用
--entrypoint
标记到 运行 容器以查明文件是否已装载到容器中。事实证明,我的 Docker 桌面可能存在共享驱动器问题。 - 我在前一天更换了我的 docker 守护程序,但除此问题外一切正常。
- 无论如何,将我的驱动器重新挂载到 Docker 桌面,您可以使用
docker
命令或直接打开 Docker 桌面设置来应用。
在我的例子中,这是由节点 运行 内存不足引起的。我通过将 --memory-size 1500
添加到我的 aws lambda create-function ...
命令来解决这个问题。