首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用无服务器框架和TypeScript从Lambda层导入模块

无法使用无服务器框架和TypeScript从Lambda层导入模块
EN

Stack Overflow用户
提问于 2021-07-21 14:53:23
回答 1查看 1K关注 0票数 1

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

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

代码语言:javascript
复制
/
 - layers/
   - nodejs/
     - node_modules/
     - package.json
 - src/
   - handlers/ - here are my handlers 
   - etc...

我已经将TypeScript配置为从layer文件夹导入库,就像这样的import middy from '/opt/nodejs/@middy/core';。这是我的tsconfig

代码语言:javascript
复制
{
  "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"
  ]
}

并有这样的无服务器配置

代码语言:javascript
复制
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端点(或任何其他端点)时,我有以下错误:

代码语言:javascript
复制
[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层的链接。提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2021-07-21 20:13:49

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

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

我建议尝试其他的TypeScript插件,比如serverless-esbuild

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

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

它正在使用esbuild打包并将TypeScript转换为JavaScript,并且工作正常

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68465148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档