在express.js启动之前运行异步函数 [英] Running an async function before express.js start
问题描述
在启动我的应用程序之前,我想运行一个异步操作(例如,等待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屋!