带有 AWS Lambda 错误的无服务器框架 "Cannot find module"
Serverless Framework with AWS Lambda error "Cannot find module"
我正在尝试使用无服务器框架创建一个使用开放天气 NPM 模块的 Lambda 函数。但是,我收到以下异常,但我的 node_modules 包含特定库。
我已经设法 运行 样本,(https://github.com/serverless/examples/tree/master/aws-node-rest-api-with-dynamodb) 成功,现在黑客添加节点模块以集成开放天气 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);
};
在执行 serverless deploy
之前,您是否在工作目录中 npm install
? aws-sdk
节点模块可用于所有 lambda 函数,但对于所有其他节点依赖项,您必须安装它们,以便在部署时将它们与您的 lambda 打包在一起。
您可能会发现无服务器存储库上的这个问题很有帮助 (https://github.com/serverless/serverless/issues/948)。
如果你有外部依赖,你需要做包部署。
请看这个答案
AWS Node JS with Request
参考
http://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html
我在使用无服务器框架部署多个 lambda 函数时遇到了同样的问题。我通过以下步骤修复
- 无论您将路径保留在处理程序中,例如
handler: foldername/exports.handler
- 将文件夹中的文件命名为 exports.js(无论您为处理程序命名)
- 运行
serverless deploy
这应该可以解决您的问题
我在 package.json
中修复了这个错误,我将所有内容从 devDependencies
移动到 dependencies
。
干杯
我不知道它是否适用于这个答案,但如果有人只是需要大脑刷新,我忘记导出我的处理程序并导出文件时正在寻找不存在的默认导出...
从此改变...
handler: foldername/exports
对此...
handler: foldername/exports.handler
对我来说,问题是处理程序文件名包含一个点。
main-handler.graphql.js
导致 serverless "Error: Cannot find module 'main'.
当我将文件更改为 main-handler-graphql.js
时一切正常。
您应该按如下方式安装您的模块:
npm install -D <your-module-name>
在某些情况下,不要忘记检查全局无服务器安装。
我的通过重新安装解决了:
npm install -g serverless
就我而言,有效的方法是切换到节点 10(通过 nvm)。我使用的节点 (v15.14.0) 版本比软件包可能支持的版本更新。
我的案例是配置参数以创建 AWS lambda 函数。处理程序的正确字符串是(最后一行):
Resources:
StringResourceName:
Type: 'AWS::Serverless::Function'
Properties:
Handler: myFileName.handler
其中 myFileName 是我用作 zip 文件的文件的名称。
我正在尝试使用无服务器框架创建一个使用开放天气 NPM 模块的 Lambda 函数。但是,我收到以下异常,但我的 node_modules 包含特定库。
我已经设法 运行 样本,(https://github.com/serverless/examples/tree/master/aws-node-rest-api-with-dynamodb) 成功,现在黑客添加节点模块以集成开放天气 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);
};
在执行 serverless deploy
之前,您是否在工作目录中 npm install
? aws-sdk
节点模块可用于所有 lambda 函数,但对于所有其他节点依赖项,您必须安装它们,以便在部署时将它们与您的 lambda 打包在一起。
您可能会发现无服务器存储库上的这个问题很有帮助 (https://github.com/serverless/serverless/issues/948)。
如果你有外部依赖,你需要做包部署。 请看这个答案
AWS Node JS with Request
参考
http://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html
我在使用无服务器框架部署多个 lambda 函数时遇到了同样的问题。我通过以下步骤修复
- 无论您将路径保留在处理程序中,例如
handler: foldername/exports.handler
- 将文件夹中的文件命名为 exports.js(无论您为处理程序命名)
- 运行
serverless deploy
这应该可以解决您的问题
我在 package.json
中修复了这个错误,我将所有内容从 devDependencies
移动到 dependencies
。
干杯
我不知道它是否适用于这个答案,但如果有人只是需要大脑刷新,我忘记导出我的处理程序并导出文件时正在寻找不存在的默认导出...
从此改变...
handler: foldername/exports
对此...
handler: foldername/exports.handler
对我来说,问题是处理程序文件名包含一个点。
main-handler.graphql.js
导致 serverless "Error: Cannot find module 'main'.
当我将文件更改为 main-handler-graphql.js
时一切正常。
您应该按如下方式安装您的模块:
npm install -D <your-module-name>
在某些情况下,不要忘记检查全局无服务器安装。 我的通过重新安装解决了:
npm install -g serverless
就我而言,有效的方法是切换到节点 10(通过 nvm)。我使用的节点 (v15.14.0) 版本比软件包可能支持的版本更新。
我的案例是配置参数以创建 AWS lambda 函数。处理程序的正确字符串是(最后一行):
Resources:
StringResourceName:
Type: 'AWS::Serverless::Function'
Properties:
Handler: myFileName.handler
其中 myFileName 是我用作 zip 文件的文件的名称。