我有这样一个路由器文件:
import express from 'express';
import health from './health';
import surface from './surface';
const router = express.Router();
router.use('/health', health);
router.use('/surface', surface);
router.get('*', (req, res) => {
res.status(404);
res.json({
message: 'Uknown API endpoint'
});
});
export default router;
在每条路线中,我都使用npm mysql
包来创建连接,然后在我调用 res.send()
. iirc创建一个连接并在每个查询中结束它将是一个坏主意。
我试过这样做:
router.use((req, res, next) => {
next();
mySingletonWrappingMysql.connection.end();
});
考虑到我的路由是异步的 endConnection
电话打得太早了。 next
不是真正的异步所以我不能 await next
我甚至不确定这是否是正确的方式/地点。这个例子使用的是单例,因为我也不确定如何正确地设置一个新示例以在路由中使用。 req.param
似乎是一个不是最佳的选项,因为似乎是为特殊查询参数变量。
1条答案
按热度按时间qmelpv7a1#
你需要一个连接到mysql的连接池。这是一个串行可重用连接资源池。你需要的时候就拿一个,做完了就放手。因此,每个请求,甚至每个中间件调用,都可以使用一个连接,而不必担心并发性(这对连接不起作用)。看看这个。https://www.npmjs.com/package/mysql#pooling-连接
像这样设置你的游泳池,就一次。每个node.js服务器示例需要为其使用的每个单独的mysql服务器提供一个池。
这个createpool操作创建一个最多有十个连接的池。每次使用该池时,它都会检查其所有连接是否繁忙。如果没有,它给你一个空闲的使用。如果他们都很忙,就会打开一个新的。但是,如果游泳池已经
connectionLimit
连接正在使用中,它将等待一个空闲的连接。然后随意的一次性查询就是这样工作的。在rest服务器中,您可能会发现一些get查询可以通过对数据库的单个查询来满足。这些非常简单。不需要显式地从池中获取或释放连接。而且,当您释放连接时,它将保持与dbms的连接,以供将来的请求使用。如果满足一个特定的请求需要两到三个select查询,您也可以使用这种技术。但是,每个查询可能使用与池不同的连接。
如果您需要为多个查询获取一个连接,这几乎一样简单,但是您需要记住
release()
连接完成后。当某些查询依赖于序列中先前查询的结果时,需要这样做。您可能希望改用承诺,以避免这种函数嵌套,特别是如果您希望运行一系列查询的话。