NPM mysql模块中的连接方法是否被阻塞?

Node.js( 这里 )的官方mysql NPM包文档提供了连接数据库和执行基本查询的以下build议:

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方法也采用一个可选的callback函数,文档中提供了下面这个用法的例子(忽略下面例子中的注释;这个例子实际上是试图演示别的):

 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所期望的那样在connect方法的callback中调用。 这似乎意味着连接方法阻塞(即/同步)。

所以我有一个简单的问题,然后是一些更细微的问题:

NPM mysql模块中的connect方法是否被阻塞?

如果是这样,这是否违背了Node约定? 约定是不是会在传递给connect方法的callback中进行查询?

最后,如果connect方法阻塞,并且违背Node约定,为什么mysql模块的devise者决定做connect阻塞? 这种方法的优点是什么? 作为最受欢迎的mysql Node.js包,我敢肯定这个方法是有原因的。

好问题!

从文档中我推断你执行的所有查询都在内部排队。

当你调用connection.connect() ,它将(asynchronous)开始build立到服务器的连接,并且它还会初始化一个查询队列,你想运行的所有查询(通过调用connection.query() )将会排队等候

一旦build立了实际连接,它将执行排队查询。

类似的情况发生在connection.end() :它将“…确保所有以前排队的查询仍然[执行]在发送一个COM_QUIT包到MySQL服务器” ( 源 )。

所以它可能看起来像两个方法阻塞(同步),但实际上他们不是。