有研究过felixge/node-mysql模块的Nodejs同学没
有研究过felixge/node-mysql模块的Nodejs同学没
问一个关于PoolCluster.js的问题 在https://github.com/felixge/node-mysql这个模块里面 有个文件 node_modules\mysql\lib\PoolCluster.js,里面有这么一句话
//这里为什么要处理一下pattern("abd"将被处理成"ab")
var keyword = pattern.substring(pattern.length - 1, 0);
foundNodeIds = this._serviceableNodeIds.filter(function (id) {
return id.indexOf(keyword) === 0;
});
//如果我 在poolCluster里面增加了两个连接配置,分别是"abc","abd",
poolCluster.getConnection("abc",function(err, connection) {
//这里有可能返回"abd" 这个连接,这不科学啊。
}));
这个问题是关于 node-mysql
模块中的 PoolCluster.js
文件。具体来说,PoolCluster.js
文件中有一段代码处理连接模式匹配问题。
首先,来看这段代码:
var keyword = pattern.substring(pattern.length - 1, 0);
这里,pattern
是一个字符串,比如 "abc"
。substring
方法的参数是起始位置和结束位置。但是这里的参数 (pattern.length - 1, 0)
实际上不会返回预期的结果,因为 JavaScript 的 substring
方法要求起始位置小于结束位置。正确的做法应该是:
var keyword = pattern.substring(0, pattern.length - 1);
这样,keyword
将会是 "ab"
。
接下来的部分代码是:
foundNodeIds = this._serviceableNodeIds.filter(function (id) {
return id.indexOf(keyword) === 0;
});
这一部分代码的作用是从 _serviceableNodeIds
数组中过滤出以 keyword
开头的 ID。假设 keyword
是 "ab"
,那么它会找到所有以 "ab"
开头的 ID。
关于你的问题,在 poolCluster
中增加两个连接配置 "abc"
和 "abd"
。当你调用:
poolCluster.getConnection("abc", function(err, connection) {
// 这里有可能返回 "abd" 这个连接,这不科学啊。
});
实际上,getConnection
方法可能会返回任何一个可用的连接,而不仅仅是匹配 pattern
的连接。这是因为 getConnection
方法内部使用了上述逻辑来查找匹配的连接,但并不保证一定返回完全匹配的连接。
为了确保每次都获取到匹配的连接,你可以自己实现一个更精确的匹配逻辑。例如:
poolCluster.getConnection("abc", function(err, connection) {
if (err) {
console.error("Error:", err);
return;
}
if (!connection.config.database.startsWith("abc")) {
console.log("Unexpected connection:", connection.config.database);
} else {
console.log("Correct connection:", connection.config.database);
}
});
这段代码会在获取连接后检查连接的数据库名是否以 "abc"
开头,如果不是则打印错误信息。
希望这些解释能帮助你更好地理解这个问题。