AWS Lambda错误:“找不到模块'/ var / task / index'”

时间:2017-01-19 19:23:12

标签: javascript node.js amazon-web-services request aws-lambda

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)"
    ]
}

我搜索了无数篇文章,并安装了模块-j,请求以及许多其他应该使代码运行的Node模块,但似乎没有解决这个问题。这是我的目录,以防万一:

- planyr.zip
   - index.js
   - node_modules
   - package.json

有谁知道这个问题是什么?非常感谢你。

9 个答案:

答案 0 :(得分:212)

修正了它!我的问题是我试图在Finder中使用Mac的内置压缩功能压缩文件。

如果您是像我这样的Mac用户,当您位于项目的根目录(包含index.jsnode_modules的文件夹时,应该在终端中运行以下脚本,等文件)。

zip -r ../yourfilename.zip *

对于Windows:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip

答案 1 :(得分:21)

更新为已接受的答案:发生此错误时,表示您的zip文件不是AWS所需的有效格式。

如果双击zip,你会在你的代码文件中找到你的文件夹,但lambda想要当你双击zip时它会显示直接的代码文件。

实现这一目标:

open terminal  
cd your-lambda-folder 
zip -r index.zip *

然后,将index.zip上传到AWS Lambda。

答案 2 :(得分:16)

检查文件名和处理程序名称是否相同:

In this case we expect that all our code will be in <code>bundle.ls</code> file

这意味着zip文件具有导出bundle.js函数的handler文件:

exports.handler = (event, context, callback) => {//...}

答案 3 :(得分:4)

这可能是部署zip中文件的权限问题。 尝试chmod 777您的文件,然后将其打包成zip文件。

答案 4 :(得分:3)

就我而言,这是因为我的处理程序文件位于内部src目录中。

我必须从以下位置更改Lambda中的'Handler'属性:

index.handler

src/index.handler

答案 5 :(得分:2)

在我的情况下,存档包含带有index.js文件的文件夹“ src”,因此我不得不将其放入处理程序:“ src / index.handler”

enter image description here

答案 6 :(得分:0)

在我的情况下,我不得不替换

exports.handler = function eventHandler (event, context) {

exports.handler = function (event, context, callback) {

答案 7 :(得分:0)

在Windows中使用lambci/lambda:nodejs8.10时出现此错误。

我已经尝试了上面列出的所有解决方案,但没有一个可以帮助我解决问题(即使错误堆栈看起来与问题相同)。

这是我的简单解决方案:

  1. 使用--entrypoint标志运行容器,以查明文件是否已安装到容器中。事实证明,我的Docker桌面可能遇到共享驱动器问题。
  2. 前一天,我切换了docker守护进程,但除此问题外,一切正常。
  3. 无论如何,将驱动器重新安装到Docker Desktop上,您都可以使用docker命令,也可以打开Docker Desktop设置来应用。

答案 8 :(得分:0)

在我的情况下,这是由Node内存不足引起的。我通过在--memory-size 1500命令中添加aws lambda create-function ...来解决了这个问题。