javascript - express.js(或类似)应用程序的异步初始化

标签 javascript node.js asynchronous express web-frameworks

考虑一个示例:我有以下 express.js 应用程序(请参见下面的代码片段)。我希望在整个应用程序生命周期内与数据库建立一个持久连接,并与我自己的服务建立一个持久连接(这需要异步调用才能启动)。还有一些入口点,即不仅可以通过 HTTP 协议(protocol)访问我的应用程序。当然,我想避免服务初始化代码重复,可能会有多个这样的异步初始化服务。

/* app.js */
var app = require('express')();
// set views, use routes, etc.
var db = require('monk/mongoose/etc')(...); // happily, usually it's a sync operation
var myService = require('./myService');     // however, it's possible to have several such services
myService.init(function(err, result) {
    // only here an initialization process is finished!
});

module.exports.app = app;


/* http_server.js (www entry point) */
var app = require('app');
// create an HTTP server with this app and start listening


/* telnet_server.js (other entry point) */
var app = require('app');
// create a Telnet server with this app and start listening

在上面的代码片段中,当 http(或 telnet,或任何其他)服务器启动时,无法保证 myService 已经初始化。

因此,我必须以某种方式重新组织我的应用程序创建代码。现在我坚持使用下一个解决方案:

/* app.js */
var app = require('express')();
module.exports.app = app;
module.exports.init = function(callback) {
    var myService = require('./myService');
    myService.init(callback);     
}

/* entry_point.js */
var app = require('app');
app.init(function(err) {
    if (!err) {
        // create an HTTP/Telnet/etc server and start listening
    }
});

那么,我的问题是:初始化需要异步调用启动的服务的常用方法是什么?

最佳答案

我会建议你 promise 你的服务的初始化功能,然后按以下方式使用它们:

const app = require('express')();
const util = require('util');
const myService = require('./myService');
const myServiceInit = util.promisify(myService.init);
Promise.all([myServiceInit]).then(() => {
  // delayed listening of your app
  app.listen(2000);
}).catch(err => {
 // handle error here
});

我使用 Promise.all 来让您添加多个内部服务的初始化。

promise 初始化函数的先决条件是它应该使用错误优先回调机制。您可以在这里阅读更多相关信息 Node Official Doc

希望这对您的事业有所帮助。

关于javascript - express.js(或类似)应用程序的异步初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34660414/

相关文章:

javascript - Google map 与另一个 iframe 存在问题

javascript -\B 在正则表达式中没有按预期工作

javascript - css 未在 nodejs 网络应用程序中呈现

azure - 为什么我对 Azure 的调用会杀死 HttpContext.Current

linux - 异步 posix_fallocate()?

javascript - 如何在下拉菜单中设置值

javascript - 验证码警报显示,即使我填写了验证码文本

javascript - 无法使用socket.io在nodejs服务器和客户端之间通信我的数据

node.js - Parent.setChild 不是一个函数

ios - Swift:异步回调