使用promise返回lambda处理函数

时间:2018-02-12 02:18:31

标签: node.js aws-lambda

我正在使用aws-serverless-express为我的lambda处理程序执行以下操作:

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调用,直到我能够进行所有初始化设置。

1 个答案:

答案 0 :(得分:1)

我遇到过这个问题。也许你现在已经解决了。对我来说,这是冷启动,我希望我的应用程序在开始处理请求之前完全初始化,但是异步加载或重新加载aws-serverless模块​​不起作用。相反,我在app.js / main js文件中定义了一个默认路由,并且该路由在系统中的所有其他路由之前执行。我将next()参数传递给它,并且在我的初始加载时它延迟按下直到完成,所以我的应用程序中的所有请求响应都保持到系统加载为止。

在我的app.js内

app.use((req, res, next) => {
  systemService.initSystemConfiguration().then(() => {
    next()
  })
})

<强> system.services.js

module.exports.initSystemConfiguration = function() {
if(systemInitialized) {
     return Promise.resolve(true)
}
return longComputationReturningPromise()