NodeJS 如何在Connect中间件中使用异步初始化?

cbwuti44  于 2023-06-05  发布在  Node.js
关注(0)|答案(2)|浏览(203)

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

现在我在想是否有更好的方法,例如。让中间件在后台初始化,并延迟所有传入的请求,直到中间件准备好。
我该怎么解决这个问题?有什么想法或最佳实践我应该在这里使用吗?

jfgube3f

jfgube3f1#

现在我使用一个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);

请注意,这段代码没有以任何方式进行优化或重构,它只是一个演示,说明这个想法本身是可行的。

j13ufse2

j13ufse22#

为什么你不像下面这样做,

doSomeAsyncInitialization(function () {
   //After doing all long running init process just configure your express as follows.
   app.use(<middlewares>);
   app.listen(<portnumder>);

});

相关问题