gpt4 book ai didi

node.js - 无法使用无服务器框架和 TypeScript 从 Lambda 层导入模块

转载 作者:行者123 更新时间:2023-12-05 01:58:37 25 4
gpt4 key购买 nike

我的无服务器应用程序中有几个函数。其中两个用于 REST 端点,一个用于 SQS 处理程序。他们都在使用相同的库。因此,我想将它们移动到 Lambda 层并跨函数共享以减小大小。

我使用的是无服务器框架 2.46、TypeScript 4.3 和 NodeJS 14。我有以下项目结构:

/
- layers/
- nodejs/
- node_modules/
- package.json
- src/
- handlers/ - here are my handlers
- etc...

我已将 TypeScript 配置为从层文件夹导入库,如下所示 import middy from '/opt/nodejs/@middy/core';。这是我的 tsconfig

{
"compilerOptions": {
"preserveConstEnums": true,
"strictNullChecks": true,
"sourceMap": true,
"allowJs": false,
"target": "ES2020",
"module": "CommonJS",
"outDir": ".build",
"moduleResolution": "node",
"esModuleInterop": true,
"resolveJsonModule": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"lib": [
"ES6",
"ES2019",
"ES2020"
],
"baseUrl": ".",
"paths": {
"/opt/nodejs/*": [
"layers/nodejs/node_modules/*"
]
}
},
"exclude": [
"node_modules",
"opt/nodejs/node_modules"
]
}

并且有像这样的无服务器配置

service: my_serverless-app
frameworkVersion: '2'
useDotenv: true
variablesResolutionMode: 20210326
configValidationMode: error

custom:
stage: ${opt:stage, self:provider.stage}
dbHost:
local: ${env:DB_HOST, ''}
dev: ${ssm:DB_HOST_DEV}

dbPort:
local: ${env:DB_PORT, ''}
dev: ${ssm:DB_PORT_DEV}

dbUser:
local: ${env:DB_USER, ''}
dev: ${ssm:DB_USER_DEV}

dbPassword:
local: ${env:DB_PASSWORD, ''}
dev: ${ssm:DB_PASSWORD_DEV}

dbName:
local: ${env:DB_NAME, ''}
dev: ${ssm:DB_NAME_DEV}

provider:
name: aws
region: us-east-1
stage: dev
runtime: nodejs14.x
lambdaHashingVersion: 20201221
environment:
NODE_PATH: "./:opt/nodejs/node_modules"
DB_HOST: ${self:custom.dbHost.${self:custom.stage}}
DB_PORT: ${self:custom.dbPort.${self:custom.stage}}
DB_USER: ${self:custom.dbUser.${self:custom.stage}}
DB_PASSWORD: ${self:custom.dbPassword.${self:custom.stage}}
DB_NAME: ${self:custom.dbName.${self:custom.stage}}

plugins:
- serverless-plugin-typescript
- serverless-offline

functions:
getLedgerRecords:
handler: src/handlers/ledger.ledgerRecords
events:
- http:
path: /ledger-records
method: get
layers:
- { Ref: CommonLibsLambdaLayer }

getLedgerRecord:
handler: src/handlers/ledger.ledgerRecord
events:
- http:
path: /ledger-records/{id}
method: get
layers:
- { Ref: CommonLibsLambdaLayer }

layers:
CommonLibs:
path: layers/nodejs
description: "Common dependencies"
compatibleRuntimes:
- nodejs14.x

当我通过命令 serverless offline --stage local 在本地运行应用程序时我没有错误,但是当我执行 REST 端点(或任何其他端点)时我有以下错误:

[offline] Loading handler... (D:\Projects\services\.build\src\handlers\ledger)
[offline] _____ HANDLER RESOLVED _____
offline: Failure: Cannot find module '/opt/nodejs/@middy/core'
Require stack:
- D:\Projects\services\.build\src\handlers\ledger.js
- D:\Projects\services\node_modules\serverless-offline\dist\lambda\handler-runner\in-process-runner\InProcessRunner.js
- D:\Projects\services\node_modules\serverless-offline\dist\lambda\handler-runner\in-process-runner\index.js
- D:\Projects\services\node_modules\serverless-offline\dist\lambda\handler-runner\HandlerRunner.js
- D:\Projects\services\node_modules\serverless-offline\dist\lambda\handler-runner\index.js
- D:\Projects\services\node_modules\serverless-offline\dist\lambda\LambdaFunction.js
- D:\Projects\services\node_modules\serverless-offline\dist\lambda\LambdaFunctionPool.js
- D:\Projects\services\node_modules\serverless-offline\dist\lambda\Lambda.js
- D:\Projects\services\node_modules\serverless-offline\dist\lambda\index.js
- D:\Projects\services\node_modules\serverless-offline\dist\ServerlessOffline.js
- D:\Projects\services\node_modules\serverless-offline\dist\index.js
- D:\Projects\services\node_modules\serverless-offline\dist\main.js
- D:\Projects\services\node_modules\serverless\lib\classes\PluginManager.js
- D:\Projects\services\node_modules\serverless\lib\Serverless.js
- D:\Projects\services\node_modules\serverless\scripts\serverless.js
- D:\Projects\services\node_modules\serverless\bin\serverless.js

此外,我在尝试部署应用程序时遇到了同样的问题。我究竟做错了什么?请给我一个教程链接,了解如何正确配置 lambda 层。提前致谢!

最佳答案

从无服务器框架和 TypeScript 的角度来看,您的层配置是正确的。

问题可能出在项目本身的打包上(例如 serverless-plugin-typescript 的内部)

我建议尝试使用另一个 TypeScript 插件,例如 serverless-esbuild

使用您的 tsconfig.json 示例和来自 serverless.yml 的示例。我在这里创建了一个示例:

https://github.com/oieduardorabelo/2021-07-21-serverless-typescript-layers

它使用 esbuild 将 TypeScript 打包和转换为 JavaScript,并且按预期工作

关于node.js - 无法使用无服务器框架和 TypeScript 从 Lambda 层导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68465148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com