为Node.js的MySQL官方NPM包文档(here)使以下建议用于连接到数据库和执行基本查询:NPM mysql模块中的连接方法是否被阻塞?
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
database : 'my_db'
});
connection.connect();
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
connection.end();
connect方法也有一个可选的回调函数,并且该文档规定用法如下例所示(请忽略以下示例中的意见;这个例子实际上是试图证明别的东西):
var connection = require('mysql').createConnection({
port: 84943, // WRONG PORT
});
connection.connect(function(err) {
console.log(err.code); // 'ECONNREFUSED'
console.log(err.fatal); // true
});
connection.query('SELECT 1', function (error, results, fields) {
console.log(error.code); // 'ECONNREFUSED'
console.log(error.fatal); // true
});
在这两种情况下,查询方法connect方法后调用,并不是,正如可以预料的那样,在connect方法的回调中。这似乎意味着连接方法阻塞(即/同步)。
所以我有一个简单的问题,其次是一些更微妙的问题:
是在故宫的mysql模块阻击connect
方法?
如果是这样,没有这种违背公约的节点?这个约定是不是会在传递给connect
方法的回调中做查询?
最后,如果connect方法阻塞并且违背Node约定,为什么mysql模块的设计者决定阻止connect
?这种方法的优点是什么?作为最受欢迎的mysql Node.js包,我确信这种方法被采用是有原因的。
Thanks @robertklep!这是有道理的,似乎是可能的解释。有人可以授权确认吗? – VKK
您可以随时开始翻翻来源,例如,[这里是'connection.query()'](https://github.com/mysqljs/mysql/blob/f98d2faaf386a646e011da874eb9b2a4a0f1f2e7/lib/Connection.js#L194- L209)。队列[创建并保持在协议驱动程序(https://github.com/mysqljs/mysql/blob/f98d2faaf386a646e011da874eb9b2a4a0f1f2e7/lib/protocol/Protocol.js#L28)。 – robertklep