AWS Lambda Layers - Typescript - 在索引处理程序中指定导入时出现问题,因为在层中需要采用 /opt/nodejs/ 形式

Bak*_*vic 7 amazon-web-services node.js typescript aws-lambda

我使用 Typescript 编写 AWS Lambda 代码(处理程序和共享代码),然后转换代码,将 node_modules 添加到转换代码所在的目录并发布 Lambda。这工作正常。

\n

现在,如果我想添加共享代码作为 AWS Lambda 层的一部分,这就是 Typescript 变得棘手的地方。\n请考虑我拥有的以下代码结构:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 index.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 userData.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 node_modules\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package-lock.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n
Run Code Online (Sandbox Code Playgroud)\n

我想要一个包含以下内容的层:

\n
node_modules\nuserData.ts\n
Run Code Online (Sandbox Code Playgroud)\n

我知道发布图层时需要存在的结构以及如何在index.ts(处理程序方法)代码中引用它。

\n

在层之前,我的 index.ts 代码如下所示:

\n
import { UserData } from "./lib/userData";\n\nexport const handler = async (event: any = {}): Promise<any> => {\n   # some code here\n}\n
Run Code Online (Sandbox Code Playgroud)\n

因为我想从图层导入 UserData,所以导入需要如下所示:

\n
import { UserData } from "./opt/nodejs/userData";\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果我指定这一点,并尝试转译代码(在创建 aws lambda 包之前),我将收到一个明显的错误:

\n
index.ts:1:26 - error TS2307: Cannot find module '/opt/nodejs/userData' or its corresponding type declarations.\n\n1 import { UserData } from "/opt/nodejs/userData";\n                           ~~~~~~~~~~~~~~~~~~~~~~\n
Run Code Online (Sandbox Code Playgroud)\n

有一些方法可以避免这种情况:

\n
    \n
  1. // @ts-ignore在实际导入之前添加将消除此错误
  2. \n
  3. 肮脏/黑客的方式是在转译代码上编辑此导入,这不是我想要做的。
  4. \n
\n

现在,这似乎是一个先有鸡还是先有蛋的问题,而且我是 AWS Lambda 的新手,所以对于如何处理这种情况而不使用这些古怪的方法来避免它有什么建议吗?

\n

小智 4

我使用打字稿路径映射解决了这个问题。您可以将其添加到 tsconfig.json 中。

"baseUrl": ".",
"paths": {
  "/opt/nodejs/*": ["src/testLayer/nodejs/*"]
Run Code Online (Sandbox Code Playgroud)

这向 TS 编译器指定 /opt/nodejs/ 路径实际上指向我们本地目录结构中的 src/testLayer/nodejs/,因此它从那里获取文件