无服务器框架与AWS Lambda错误"找不到模块"

43

我正在尝试使用Serverless框架创建一个Lambda函数,该函数使用open weather NPM模块。然而,我遇到了以下异常,但我的node_modules包含特定的库。

我已经成功运行了示例(https://github.com/serverless/examples/tree/master/aws-node-rest-api-with-dynamodb),现在正在破解以添加节点模块来集成open weather API。

Endpoint response body before transformations: {"errorMessage":"Cannot find module 'Openweather-Node'","errorType":"Error","stackTrace":["Module.require (module.js:353:17)","require (internal/module.js:12:17)","Object.<anonymous> (/var/task/todos/weather.js:4:17)","Module._compile (module.js:409:26)","Object.Module._extensions..js

我的代码

'use strict';

  const AWS = require('aws-sdk'); // eslint-disable-line import/no-extraneous-dependencies
  var weather = require('Openweather-Node');

  const dynamoDb = new AWS.DynamoDB.DocumentClient();

  module.exports.weather = (event, context, callback) => {
    const params = {
      TableName: process.env.DYNAMODB_TABLE,
      Key: {
        id: event.pathParameters.id,
      },
    };

    weather.setAPPID("mykey");
    //set the culture
    weather.setCulture("fr");
    //set the forecast type
    weather.setForecastType("daily");

    const response = {
      statusCode: 200,
      body: "{test response}",
    };
    callback(null, response);          
  };
13个回答

49

在执行serverless deploy之前,您是否在工作目录中执行了npm install命令?aws-sdk节点模块可用于所有Lambda函数,但对于其他所有Node依赖项,您必须安装它们,以便在部署Lambda时打包它们。

您可能会发现在serverless存储库中此问题非常有帮助(https://github.com/serverless/serverless/issues/948)。


非常好,做了其他所有事情,但是这个没有做。感谢您的及时回答! - Charith De Silva

10

当我将package.json中的所有内容从devDependencies移动到dependencies时,我解决了这个错误。

干杯!


3

我之前犯了一些愚蠢的错误,但我还是想把它放在这里,以便像我这样的初学者不必为此苦苦挣扎。我从示例中复制了serverless.xml文件,其中处理程序的值为

handler: index.handler

但是我的 index.js 文件在 src 文件夹中。因此我一直收到文件未找到的错误。当我将处理程序的值更改为后,它就可以正常工作了。

 handler: src/index.handler

2

我不确定这个答案是否适用,但是如果有人只需要刷新一下大脑,我忘记导出我的处理程序并且正在导出查找不存在的默认导出文件...

从这个... handler: foldername/exports

改为这个... handler: foldername/exports.handler


2
我在使用无服务器框架部署多个 Lambda 函数时遇到了相同的问题。我通过以下步骤解决了这个问题:
  1. 无论你在处理程序中保留路径如 handler: foldername/exports.handler
  2. 将文件夹内的文件命名为 exports.js(无论你如何命名处理程序)
  3. 运行 serverless deploy
这应该可以解决你的问题。

如果您正在使用sam local开发lambda函数,那么这个选项是很好的选择。 - Ankit Rana

1

我去了云监控并查找了缺失的程序包

然后执行npm i "缺失的程序包",再执行sls deploy

这些缺失的程序包需要在依赖项中添加,我的情况下有一些是开发依赖项,还有一个缺失的依赖项


0

请提供更多细节。 - Sebastián Rojas

0
在一些情况下,不要忘记检查全局无服务器安装。我的问题通过重新安装解决了:
npm install -g serverless

0
在我的情况下,有效的解决方法是切换到 node 10(通过 nvm)。我使用的是比包支持的版本更新的 node 版本(v15.14.0)。

0

您的ts文件存在问题,因为serverless-offline插件找不到相应的js文件,所以会抛出“模块未找到”的错误。

有一个解决方法是安装(serverless-plugin-typescript)。唯一的问题是该插件会创建一个新的.build/.dist文件夹,并包含转换后的js文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接