gpt4 book ai didi

node.js - 在 expressjs 中设置请求清理中间件

转载 作者:搜寻专家 更新时间:2023-10-31 22:37:34 24 4
gpt4 key购买 nike

我正在尝试使用 postgresql 作为后端编写一个 expressjs 服务器。每个请求都通过调用 pg.connect 来获取池连接(client)以及在不再需要连接时将其返回池的方法(完成)。例如:

  function dbConnect(req, res, next) {
if (res.locals.pgCtx) {
next();
return;
}

pg.connect(dbConn, function (err, client, done) {
if (err) {
res.send(500, err.message);
} else {
app.locals.pgCtx = res.locals.pgCtx = {
client: client,
done: done
};
next();
}
});
}

app.use(allowCrossDomain);
app.use(express.methodOverride());
app.use(express.compress());
app.use(express.bodyParser());
app.use(express.logger());
app.use(passport.initialize());
app.use(express["static"](webRootDir));
app.use(dbConnect); // <--------------
app.use(authenticate);
app.use(app.router);
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
app.set('view engine', 'jade');
app.set('views', webRootDir);
app.engine("jade", jade.__express);

indexHandlers = [fetchConstData, function (req, res) {
res.render(templatesDir + 'index', {
constData: app.locals.constData,
env: app.get('env'),
user: req.user,
admin: isAdmin(req.user.role),
host: req.host
});
}];
app.get('/', indexHandlers);
app.get('/index', indexHandlers);
app.get('/index.html', indexHandlers);

我的问题是,虽然我可以将 dbConnect 作为全局中间件插入到任何其他中间件之前运行,但我还需要能够在所有中间件运行后进行清理,以便将连接返回到池中。

理想情况下,应该有一种方法可以指定在所有请求特定的中间件运行之后运行的全局中间件,无论请求如何结束 - 通过:

  • res.send(...)
  • 抛出异常
  • 将 err 对象传递给 next()

请注意,任何特定于请求的中间件都可以通过这种方式终止链。

现在我只能看到这种方法:

  1. 通过注册自定义全局错误处理程序中间件而不是 express.errorHandler 来处理负面结果。
  2. res 对象中的 res.send 方法替换为自定义版本,该版本首先将连接返回到池中,然后继续处理原始 res。发送实现。

所有这些都带有强烈的黑客气味。我想做对,所以我想问有没有办法注册像请求清理中间件这样的东西?

编辑

静态内容处理程序必须移动到 dbConnect 中间件之上,否则我们会泄漏数据库连接,直到没有更多连接可用并且服务器无法提供任何服务,因为 dbConnect永远不会等待释放连接。

最佳答案

有一个 finish 事件,您可以在响应对象上监听该事件,该事件将在响应完成时发出:

function dbConnect(req, res, next) {
res.on('finish', function() {
// perform your cleanups...
});
...
}

关于node.js - 在 expressjs 中设置请求清理中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18783385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com