在express.js启动之前运行异步函数 [英] Running an async function before express.js start

查看:108
本文介绍了在express.js启动之前运行异步函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to run an async operation (for example, wait for a URL call to complete) before I start my app. I don't know how to do that (since it's an upper-level application - no async/await here).

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

I thought about wrapping all of app.js with a Promise.promisify() so I can use async await withing it. But I'm not sure how that would be handled in www.js, since it is not invoked, as in app() but passed on to http.createServer

推荐答案

根据您的说法,app.js可能正在导出某些内容(也许是app?),但是直到某个异步调用(我认为您没有看到)已经完成.

From what you've said, app.js is presumably exporting something (perhaps app?) but that something isn't ready to be used until an asynchronous call (which I don't think you've shown) is complete.

假设这都是真的,那么app.js导出的内容需要提供一种使用它的事物等待完成的方式.做到这一点的一种方法是使用诺言.

Assuming that's all true, then what app.js exports needs to provide a way for the things using it to wait until it's ready. One way to do that is to use a promise.

假设您没有在等待什么,那么:

Assuming what you're waiting for isn't promise-ified, then:

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);
});


当然,如果您正在等待的异步事情为您带来了希望,那么您不需要app.js中的new Promise;相反:


Of course, if the async thing you're waiting for provides a promise to you, you don't need new Promise in app.js; instead:

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;
});

这篇关于在express.js启动之前运行异步函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆