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


87

Node.js Alexa任务问题

我目前正在通过AWS Lambda编写一个Node.js Alexa Task,并且我一直在尝试编写一个函数,该函数从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
Anthony Krivonos

3
除了在Mac上使用终端进行压缩的答案之外,还请确保您的代码文件名为“ index.js”。我的名字更具描述性,产生了错误。
艺术

1
@Art这是我的问题。我压缩了一个test.js,它抛出了未处理的错误。将其更改为index.js后,它可以正常工作。谢谢。
哈德斯(Hudspeth)

Answers:


229

解决它!我的问题是我尝试使用Finder中Mac内置的压缩​​功能压缩文件。

如果你是一个Mac用户,像我这样的,那么当你在你的项目的根目录(文件夹包含您运行终端下面的脚本index.jsnode_modules等文件)。

zip -r ../yourfilename.zip *

对于Windows:

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

7
我像这样压缩:“ zip -r folder folder.zip”,当然这失败了。感谢您仅压缩文件而不是目录的提示
Dane Macaulay

6
Windows怎么样?
Alok Rajasukumaran

还请确保为函数命名index.js
Knowledge

有什么办法可以从目录外部执行此操作吗?
andrhamm '17

1
@andrhamm是的。格式为zip -r /path/to/destination.zip /path/to/source/directory/*。压缩目录的内容。如果您也想压缩目录本身,请使用/ path / to / source / directory,不要带*。
加兹

23

更新为可接受的答案:发生此错误时,这意味着您的zip文件不是AWS要求的有效格式。

如果您双击zip,则会在代码文件中找到您的文件夹,但是lambda希望当您双击zip时,它应该显示直接代码文件。

为达到这个:

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

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


在Windows git bast中抛出错误“找不到命令”,如何解决这个问题?
Pardeep Jain

1
这是Ubuntu的命令,请在Windows上用谷歌搜索它,或者如何从命令提示符下创建zip
Ashutosh Jha

20

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

在这种情况下,我们希望所有代码都在<code> bundle.ls </ code>文件中

这意味着该zip文件具有bundle.js导出handler功能的文件:

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

4

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

我必须将Lambda中的'Handler'属性更改为:

index.handler

src/index.handler

我也遇到了这个问题。[Windows]仅仅是我在仓库的API一部分上单击鼠标右键,然后使用Send To > Compressed Folder。这将创建一个带有structure的zip api/etc,因此是一个例外!
C鲍尔

3

这可能是部署zip中的文件的权限问题。chmod 777在将文件打包为zip文件之前,请先对其进行尝试。


2
不幸的是,这似乎无法解决问题。我尝试将planyr另一个文件夹内的文件夹压缩无济于事。我的处理程序名称和主要的JavaScript文件名匹配(index)。
Anthony Krivonos

chmod 777这是一个坏建议……这是向公众开放写,读和执行的权限。请始终查找问题的路由原因。始终尝试理解执行互联网上有人告诉您执行的操作的安全隐患。安全性很重要,默认情况下必须在我们的代码中。
Exadra37 '19

3

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

在此处输入图片说明


0

就我而言,我不得不更换

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

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

0

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

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

这是我的简单解决方案:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.