【问题标题】:AWS Lambda Error: "Cannot find module '/var/task/index'"AWS Lambda 错误:“找不到模块 '/var/task/index'”
【发布时间】:2017-06-04 15:19:00
【问题描述】:

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 中无数次地运行了这个 sn-p,它似乎工作得完美无缺。但是,当我将其压缩到一个包中并将其上传到 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 上使用终端进行压缩的答案外,还要确保您的代码文件名为“index.js”。我有一个更具描述性的名称,会产生错误。
  • @Art 这是我的问题。我压缩了一个 test.js,它抛出了一个未处理的错误。将其更改为 index.js 后,它工作正常。谢谢。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我在 Windows 中使用 lambci/lambda:nodejs8.10 时遇到此错误。

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

    这是我的简单解决方案:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        zip -r ../yourfilename.zip *
        

        对于 Windows:

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

        【讨论】:

        • 我像这样压缩:“zip -r folder folder.zip”,当然这失败了。感谢您仅压缩文件而不是目录的提示
        • windows怎么样?
        • 还要确保将函数命名为index.js
        • 有什么办法可以从目录外做到这一点吗?
        • @andrhamm 是的。格式为zip -r /path/to/destination.zip /path/to/source/directory/*。压缩目录的内容。如果您也想压缩目录本身,请使用不带 *. 的 /path/to/source/directory
        【解决方案5】:

        在我的情况下,这是因为我在内部 src 目录中有处理程序文件。

        我必须将 Lambda 中的“处理程序”属性从:

        index.handler
        

        src/index.handler
        

        【讨论】:

        • 我也遇到过这个; [Windows] 只是我右击了我的仓库的API 部分并使用了Send To &gt; Compressed Folder。这将创建一个结构为 api/etc 的 zip,因此例外!
        【解决方案6】:

        在我的情况下,存档包含一个带有 index.js 文件的文件夹“src”,所以我必须将其放入处理程序:“src/index.handler”

        【讨论】:

          【解决方案7】:

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

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

          要实现这一点:

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

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

          【讨论】:

          • 在 windows git bast 中抛出错误“找不到命令”,如何解决这个问题?
          • 这是 Ubuntu 的命令,请在 windows 上谷歌它或如何从命令提示符创建 zip
          【解决方案8】:

          就我而言,我不得不更换

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

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

          【讨论】:

            【解决方案9】:

            这可能是部署 zip 中文件的权限问题。 在将文件打包成 zip 文件之前尝试chmod 777

            【讨论】:

            • 不幸的是,这似乎无法解决问题。我尝试在另一个文件夹中压缩planyr 文件夹,但无济于事。我的处理程序名称和主 JavaScript 文件名匹配 (index)。
            • chmod 777 是个坏建议……这是向公众开放写入、读取和执行的权限。请始终找到问题的路径原因。始终尝试了解执行互联网上某人告诉您的任何操作的安全隐患。安全性很重要,默认情况下必须在我们的代码中。
            猜你喜欢
            • 1970-01-01
            • 2021-11-20
            • 2020-10-14
            • 2019-11-27
            • 2015-08-21
            • 1970-01-01
            • 2022-11-24
            • 1970-01-01
            • 2021-12-16
            相关资源
            最近更新 更多