我为 Connect 和 Express 编写了一个中间件,它需要在其设置方法中进行一些繁重的工作。由于初始化任务的性质,这些东西是异步的,所以我遇到的问题是,中间件只能在初始化运行后才能访问。
目前我已经使用回调解决了它:
function setupMiddleware(callback) {
doSomeAsyncInitialization(function () {
callback(function (req, res, next) {
// The actual middleware goes here ...
});
});
}
这行得通,但对调用者来说并不好。而不是能够做到
app.use(setupMiddleware());
我必须做的:
setupMiddleware(functin (middleware) {
app.use(middleware);
});
现在我在想是否有更好的方法,例如让中间件在后台初始化并延迟所有传入请求,直到中间件准备就绪。
我该如何解决这个问题?我应该在这里使用任何想法或最佳实践吗?
最佳答案
我现在使用 isInitialized
变量并延迟中间件函数本身来解决它。请参阅以下示例:
var connect = require('connect');
var setup = function () {
var isInitialized = false;
setTimeout(function () {
isInitialized = true;
}, 10000);
function run (req, res, next) {
res.write('Foo');
res.end();
}
function delay (req, res, next) {
if (isInitialized) {
return run(req, res, next);
}
setTimeout(function () {
delay(req, res, next);
}, 1000);
}
return function (req, res, next) {
if (req.url === '/foo') {
delay(req, res, next);
return;
}
next();
}
};
var app = connect();
app.use(setup());
app.use(function (req, res) {
res.write('Fertig!');
res.end();
});
var http = require('http');
http.createServer(app).listen(5000);
请注意,此代码并未以任何方式进行优化或重构,它只是展示了该想法本身的可行性。
关于node.js - 如何在 Connect 中间件中使用异步初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15569464/