在express.js启动之前运行异步函数

时间:2016-12-28 14:29:19

标签: javascript node.js express promise async-await

我想在启动应用程序之前运行异步操作(例如,等待URL调用完成)。我不知道该怎么做(因为它是一个上层应用程序 - 没有异步/等待这里)。

www.js:

var app = require('./app');
var http = require('http');
const port = '3000';
app.set('port', port);
var server = http.createServer(app);
server.listen(port);

app.js:

var express = require('express');
var app = express();
var Promise = require('bluebird');

# HERE IS WHERE I WANT TO "AWAIT" AN ASYNCHRONOUS CALL. 
# I KNOW I CAN'T USE AWAIT BECAUSE I'M NOT WITHIN 
# AN "ASYNC" ANNOTATED FUNCTION. EXAMPLE:
const data = await Promise.promisify(fs.readFile('DATA'));

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
module.exports = app;

我考虑用Promise.promisify()包装所有app.js,以便我可以使用异步等待它。但我不确定如何在www.js中处理,因为它未被调用,如app(),但传递给http.createServer

2 个答案:

答案 0 :(得分:7)

根据你所说的,app.js可能是出口的东西(也许是app?)但是在异步通话之前还没有准备好使用它(我不喜欢#39;认为你已经完成了)。

假设这一切都是正确的,那么app.js出口需要为使用它的东西提供一种方法,等待它准备就绪。一种方法是使用承诺。

假设你等待的不是承诺,那么:

app.js

var express = require('express');
var app = express();
exports.appPromise = new Promise(function(resolve, reject) {
    startTheAsyncOperation(function(err, result) {
        if (err) {
            reject(err);
            return;
        }
        app.set('views', path.join(__dirname, 'views'));
        app.set('view engine', 'jade');
        app.use(express.static(path.join(__dirname, 'public')));
        app.use('/', routes);
        resolve(app);
    });
});

然后在www.js

var appPromise = require('./app').appPromise;
var http = require('http');
const port = '3000';
appPromise.then(function(app) {
    app.set('port', port);
    var server = http.createServer(app);
    server.listen(port);
});

当然,如果您等待的异步内容为您提供了承诺,那么new Promise中您不需要app.js;代替:

var express = require('express');
var app = express();
exports.appPromise = startTheAsyncOperation().then(function() {
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade');
    app.use(express.static(path.join(__dirname, 'public')));
    app.use('/', routes);
    return app;
});

答案 1 :(得分:0)

看看异步包。根据您的需要,您应该使用async包提供的瀑布控制流程。 You cann have a look as it is very well documented.

您可以使用瀑布函数包装代码,这部分代码将同步运行。