node.js - 如何在 Connect 中间件中使用异步初始化?

标签 node.js express connect

我为 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/

相关文章:

node.js - 为什么在 npm 中为插件使用对等依赖项?

node.js - 套接字io。禁用自动加入由套接字 ID 标识的房间

javascript - 处理重复任务的警报模式

node.js - Node.js 的沙盒插件

javascript - app.use 在发送错误后出现 Can\t set headers 错误

javascript - 如何在 Express Nodejs 中更改本地范围内的全局 var 值

node.js - sendFile() 在推送到 heroku 时不发送 ng build dist/index.html 文件

java - 与 mediaUrl 的 URL 连接失败,收到错误消息意外的状态行 : ICY 200 OK on KitKat

android - 蓝牙配对并连接设备

node.js - 如何在node.js中连接unix-socket时捕获错误