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

era*_*ran 5 javascript node.js promise express 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);
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

我想app.js用Promise.promisify()包装所有内容,所以我可以使用异步等待它.但是我不确定如何处理www.js它,因为它没有被调用,因为它被app()传递给了http.createServer

T.J*_*der 8

从你所说的,app.js可能是出口的东西(也许是app?)但是在异步调用(我认为你没有显示)完成之前,还没有准备好使用某些东西.

假设这一切都是正确的,那么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);
    });
});
Run Code Online (Sandbox Code Playgroud)

然后在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);
});
Run Code Online (Sandbox Code Playgroud)

当然,如果你等待的异步事物向你提出了承诺,你就不需要new Promiseapp.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;
});
Run Code Online (Sandbox Code Playgroud)