首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NPM模块中的connect方法是否阻塞?

问NPM模块中的connect方法是否阻塞?
EN

Stack Overflow用户
提问于 2017-04-25 13:59:51
回答 1查看 362关注 0票数 1

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

代码语言:javascript
复制
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方法还接受一个可选的回调函数,文档提供了以下这种用法的示例(忽略下面示例中的注释;此示例实际上试图演示其他内容):

代码语言:javascript
复制
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方法正在阻塞(即/同步)。

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

是NPM模块中的方法阻塞?。

如果是这样的话,这不违背节点约定吗?不是要在传递给connect方法的回调中执行查询吗?

最后,如果连接方法是阻塞的,并且违背了节点约定,为什么mysql模块的设计者决定让connect 阻塞?这种方法的优点是什么?作为最流行的mysql Node.js包,我相信采取这种方法是有原因的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-25 14:09:10

问得好!

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

当您调用connection.connect()时,它将(异步地)开始设置到服务器的连接,它还将初始化一个查询队列,您想要运行的所有查询(通过调用connection.query())都将排队。

一旦建立了实际的连接,它将执行排队查询.

connection.end()也会发生类似的情况:它将“确保在向connection.end()服务器发送COM_QUIT数据包之前仍然执行所有以前排队的查询”(来源)。

因此,看起来这两种方法都是阻塞的(同步的),但实际上它们不是。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43612820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档