我试图在构建 Lambda 函数时使用 TypeScript,但在使用同样用 TypeScript 编写的 Lambda 层时遇到问题。
TypeScript 无法识别我的层的 /opt/nodejs/... 导入(因为它会在 SAM 或 AWS 中运行),因此我无法将我在层中定义的类型导入到我的 Lambda 函数。
我试图查看我是否能够以某种方式 npm 链接该层,但我似乎无法使其正常工作,因为导入是本地路径 '/opt/nodejs...' 而不仅仅是模块名称。
层:
export interface SomeType {
someField: string
}
Run Code Online (Sandbox Code Playgroud)
拉姆达:
import { SomeType } from '/opt/nodejs/myLayer' // this does not work
Run Code Online (Sandbox Code Playgroud)
我刚刚收到错误消息:Cannot find module '/opt/nodejs/myLayer'.ts(2307)我发现自己不得不用它来抑制它,// @ts-ignore can be ignored as this is a Lambda layer但这意味着我无法使用层中的 TypeScript 类型。
我的项目结构如下:
MyProject
layers
myLayer1
nodejs
node_modules
myLayer1
myExtension.js
lambda1
handler.js
lambda2
handler.js
jsconfig.json
Run Code Online (Sandbox Code Playgroud)
myExtension.js
module.exports.myTest = () => {
return 'My extension test';
};
Run Code Online (Sandbox Code Playgroud)
处理程序.js
const myext = require('myLayer1');
module.exports.handler = async (event) => {
return {
statusCode: 200,
body: JSON.stringify({
message: myext.myTest()
})
}};
Run Code Online (Sandbox Code Playgroud)
当我部署到 AWS 时,一切正常。但我无法在本地计算机上运行/调试它。
根据我的发现,在这种情况下 jsconfig.json 文件应该有助于映射路径,但是 VSCode/NodeJS 会忽略我在那里编写的任何内容(我尝试将其放置在 MyProject 根文件夹和 lambda 文件夹中)。
如果我将 handler.js 中的“require”更改为:
const myext = require('./layers/myLayer1/nodejs/node_modules/myLayer1');
Run Code Online (Sandbox Code Playgroud)
当我将代码部署到 AWS 时,这显然会破坏代码。