[英]Typescript modules are not been imported in lambda function while its deploying through cdk
I use CDK to develop my serverless application in AWS.我使用 CDK 在 AWS 中开发我的无服务器应用程序。 When I try to deploy a lambda function post after TS file compilation, its not importing TS modules in lambda function as JS modules. When I try to deploy a lambda function post after TS file compilation, its not importing TS modules in lambda function as JS modules.
Due to that, I am facing an Module not found error when I invoke my lambda.因此,当我调用 lambda 时,我遇到了未找到模块的错误。
The steps that I follow before I deploy the stack:我在部署堆栈之前遵循的步骤:
Ts config: ts配置:
{
"compilerOptions": {
"target": "ES2018",
"module": "commonjs",
"lib": [
"es2018"
],
"noEmit": false,
"declaration": false,
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"noImplicitThis": true,
"alwaysStrict": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": false,
"inlineSourceMap": true,
"inlineSources": true,
"experimentalDecorators": true,
"strictPropertyInitialization": false,
"typeRoots": [
"./node_modules/@types"
]
},
"exclude": [
"node_modules",
"cdk.out"
]
}
Code:代码:
import { APIGatewayProxyEventV2, APIGatewayProxyResultV2 } from 'aws-lambda';
import { DynamoDBClient, GetItemCommand, GetItemCommandInput } from "@aws-sdk/client-dynamodb";
import { marshall, unmarshall } from "@aws-sdk/util-dynamodb";
export async function handler(event: APIGatewayProxyEventV2,): Promise<APIGatewayProxyResultV2> {
console.log('event', event);
let userLat = event.pathParameters?.lat;
let userLng = event.pathParameters?.lng;
let tableName = process.env.TABLE_NAME;
let results;
const dbClient: DynamoDBClient = new DynamoDBClient({ region: "ap-south-1" });
let params: GetItemCommandInput;
if (tableName) {
params = {
TableName: tableName,
Key: marshall({
"lat": userLat,
"lng": userLng
}),
};
}
const run = async function () {
try {
const resp = await dbClient.send(new GetItemCommand(params));
results = unmarshall(resp.Item || {});
} catch(err) {
results = err;
}
};
run();
return {
body: JSON.stringify(
results
),
statusCode: 200
}; }
Details:细节:
Error:错误:
{ "errorType": "Runtime.ImportModuleError", "errorMessage": "Error: Cannot find module '@aws-sdk/client-dynamodb'\nRequire stack:\n- /var/task/fetchpartner.js\n- /var/runtime/UserFunction.js\n- /var/runtime/Runtime.js\n- /var/runtime/index.js", "trace": [ "Runtime.ImportModuleError: Error: Cannot find module '@aws-sdk/client-dynamodb'", "Require stack:", "- /var/task/fetchpartner.js", "- /var/runtime/UserFunction.js", "- /var/runtime/Runtime.js", "- /var/runtime/index.js", " at _loadUserApp (/var/runtime/UserFunction.js:221:13)", " at Object.module.exports.load (/var/runtime/UserFunction.js:279:17)", " at Object. (/var/runtime/index.js:43:34)", " at Module._compile (internal/modules/cjs/loader.js:1085:14)", " at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)", " at Module.load (internal/modules/cjs/loader.js:950:32)", " at Function.Module._load (internal { "errorType": "Runtime.ImportModuleError", "errorMessage": "错误:找不到模块 '@aws-sdk/client-dynamodb'\n需要堆栈:\n- /var/task/fetchpartner.js\n- / var/runtime/UserFunction.js\n- /var/runtime/Runtime.js\n- /var/runtime/index.js", "trace": [ "Runtime.ImportModuleError: Error: 找不到模块'@aws- sdk/client-dynamodb'", "需要堆栈:", "- /var/task/fetchpartner.js", "- /var/runtime/UserFunction.js", "- /var/runtime/Runtime.js", “- /var/runtime/index.js”、“在 _loadUserApp (/var/runtime/UserFunction.js:221:13)”、“在 Object.module.exports.load (/var/runtime/UserFunction.js: 279:17)”, “在 Object. (/var/runtime/index.js:43:34)”, “在 Module._compile (internal/modules/cjs/loader.js:1085:14)”, “在Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)", "在 Module.load (internal/modules/cjs/loader.js:950:32)", "在 Z86408593C34AF77FDD16Z0DF932F8B52 .Module._load(内部/modules/cjs/loader.js:790:12)", " at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:75:12)", " at internal/main/run_main_module.js:17:47" ] } /modules/cjs/loader.js:790:12)", "在 Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:75:12)", "在 internal/main/run_main_module.js:17 :47"]}
You can run npm init
in the directory that contains your lambda code and install the modules you want there.您可以在包含 lambda 代码的目录中运行npm init
并在那里安装您想要的模块。 Another way is to use something like webpack to compile and combine your code and modules into a single file.另一种方法是使用 webpack 之类的东西来编译并将您的代码和模块组合到一个文件中。
You can use the NodeJsFunction instead of the Lambda function.您可以使用 NodeJsFunction 代替 Lambda function。 That will do an esbuild in the directory before deploying.这将在部署之前在目录中执行 esbuild。
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs.NodejsFunction.html https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs.NodejsFunction.html
https://github.com/schuettc/single-stack-full-stack-example/blob/9c5c3f51381a4c3d813ed097a298fccc16e81509/src/infrastructure.ts#L38-L51 https://github.com/schuettc/single-stack-full-stack-example/blob/9c5c3f51381a4c3d813ed097a298fccc16e81509/src/infrastructure.ts#L38-L51
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.