Sta*_*tan 6 typescript serverless-framework serverless nestjs
我正在尝试使用无服务器框架将 NestJS 实现为 AWS 无服务器功能。
我正在关注这个官方文档,我的代码与文档中的完全一样。但是,当我启动它时,我收到错误Failure: offline: handler 'handler' in [..] is not a function。
如果我进入我编译的源代码main.js并将其更改exports.handler = handler;为module.exports.handler = handler;它就开始工作。
我还尝试更改代码main.ts以适应这一点,但这没有帮助,因为 webpack 的编译方式不同。
// main.ts
const handler ...;
module.exports.handler = handler;
Run Code Online (Sandbox Code Playgroud)
这是我的main.ts
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { Callback, Context, Handler } from 'aws-lambda';
import serverlessExpress from '@vendia/serverless-express';
import { AppModule } from './app.module';
let server: Handler;
async function bootstrap(): Promise<Handler> {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
}),
);
await app.init();
const expressApp = app.getHttpAdapter().getInstance();
return serverlessExpress({ app: expressApp });
}
export const handler: Handler = async (event: any, context: Context, callback: Callback) => {
server = server ?? (await bootstrap());
return server(event, context, callback);
};
Run Code Online (Sandbox Code Playgroud)
这是我的serverless.yml
// main.ts
const handler ...;
module.exports.handler = handler;
Run Code Online (Sandbox Code Playgroud)
这是我的 webpack.config.js
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { Callback, Context, Handler } from 'aws-lambda';
import serverlessExpress from '@vendia/serverless-express';
import { AppModule } from './app.module';
let server: Handler;
async function bootstrap(): Promise<Handler> {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
}),
);
await app.init();
const expressApp = app.getHttpAdapter().getInstance();
return serverlessExpress({ app: expressApp });
}
export const handler: Handler = async (event: any, context: Context, callback: Callback) => {
server = server ?? (await bootstrap());
return server(event, context, callback);
};
Run Code Online (Sandbox Code Playgroud)
最后这是我的 tsconfig.json
service:
name: serverless-example
plugins:
- serverless-offline
provider:
name: aws
runtime: nodejs12.x
functions:
main:
handler: dist/main.handler
events:
- http:
method: ANY
path: /
- http:
method: ANY
path: '{proxy+}'
Run Code Online (Sandbox Code Playgroud)
我是否缺少 webpack 上的一些配置?或者也许改变打字稿配置文件?我不知道,文档说它应该可以工作,但事实并非如此。
理论上,我所需要的只是将其放在module.exports.handler = handler我exports.handler = handler的编译文件中,因为正如我所说,我确实更改了它并且它开始正常工作。
这是我正在使用的临时修复程序,但显然这是错误的处理方法。
"build": "nest build --webpack && sed -i 's/exports.handler = handler;/module.exports.handler = handler;/g' dist/main.js",
Run Code Online (Sandbox Code Playgroud)
由于很多人都遇到同样的问题,而我找不到“好的”解决方案,这里有一个可行的解决方案:只需将编译文件中的替换exports.handler为即可。module.exports.handlermain.js
sed这就是您在构建过程中简单使用的方法package.json
"build": "nest build --webpack && sed -i 's/exports.handler = handler;/module.exports.handler = handler;/g' dist/main.js",
"build:mac": "nest build --webpack && sed -i '' 's~exports.handler = handler;~module.exports.handler = handler;~g' dist/main.js",
Run Code Online (Sandbox Code Playgroud)
请注意,MacOS 有特定的命令,因为由于sed某种原因它有不同的实现。
| 归档时间: |
|
| 查看次数: |
2817 次 |
| 最近记录: |