【发布时间】:2018-11-27 13:14:20
【问题描述】:
我正在为我的 lambda 处理程序使用 aws-serverless-express,具体如下:
const app = express();
const server = createServer(app, null);
export const app = (event, context) => proxy(server, event, context);
这一切都很好,但我想在最后一行导出应用程序之前执行一些异步操作。
我认为我可以返回一个承诺,而不是在我的所有操作完成后解析代理,但这似乎不起作用。
有什么方法可以延迟导出处理程序,直到某些异步代码完成?
更新
虽然我已经有一段时间没有使用 lambda,但我确实做到了这一点,因此现在可能有替代解决方案。我当时所做的工作如下所示
import * as Promise from 'bluebird';
import {Callback, Context, Handler} from 'aws-lambda';
import {createServer, proxy} from 'aws-serverless-express';
import {eventContext} from 'aws-serverless-express/middleware';
import {Application} from 'express';
import {ServerlessApp} from './common/serverless-express-app';
import {startComponents} from './startup';
import * as http from 'http';
const INSTANCE = new ServerlessApp(startComponents());
const getServer = INSTANCE.initCompletePromise
.then((serverLessApp: Application) => {
serverLessApp.use(eventContext());
return createServer(serverLessApp);
});
const apiGWExpressApp: Handler = (event: any, context: Context, callback:
Callback) => {
// context.callbackWaitsForEmptyEventLoop = false;
getServer
.then((server: http.Server) => {
proxy(server, event, context);
})
.catch(error => {
CommonHelper.doHandlerCallback(() => {
INSTANCE.logger.error('ERROR: ', error);
context.fail(JSON.stringify(error));
});
});
};
export {
apiGWExpressApp
};
它的要点是我的自定义 ServerlessApp 将根据在公开可用的承诺中的构造函数中提供的内容执行各种设置步骤,例如
export class ServerlessApp {
private _initCompletePromise: Promise<express.Application>;
private _app: express.Application;
constructor(startComponents: StartComponent[]) {
this._app = express();
this._initCompletePromise =
new Promise<express.Application>((resolve, reject) => {
...
resolve(this._app);
}
}
public get initCompletePromise(): Promise<express.Application> {
return this._initCompletePromise;
}
}
通过这种方式,我能够推迟处理程序方法中的主要 createServer 调用,直到我能够完成所有初始化设置。
【问题讨论】:
-
你能解决这个问题吗?我也面临同样的问题。
-
@Jose 查看添加到问题中的更新
-
谢谢@sam。我找到了我需要的解决方案。我使用serverless 创建回调函数。我只好把它包起来
标签: node.js aws-lambda