异步如何在Express中工作?

时间:2016-09-30 02:43:16

标签: node.js express asynchronous

我在ExpressJS guide上找到了以下内容:

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'dbuser',
  password : 's3kreee7'
});

connection.connect();

connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
  if (err) throw err;
  console.log('The solution is: ', rows[0].solution);
});

connection.end();

这不应该是不好的做法吗?我看到它的方式,可以在执行查询之前结束连接。不会出错吗?

2 个答案:

答案 0 :(得分:1)

As stated here内的图片时如何检测:

  • 您在连接上调用的每个方法都会按顺序排队并执行。

  • 使用end()关闭连接,确保在将退出数据包发送到mysql服务器之前执行所有剩余的查询。

因此,即使可以在查询完成之前调用end()方法,但在查询完成执行之前,它实际上不会被执行。

这需要使用mysql包而不是NodeJS本身。

答案 1 :(得分:0)

您的问题异步如何在Express中工作?这不应该是不好的做法吗?可以通过多种方式回答,但为了清楚起见,我希望解释取决于!!!!

一般是非常糟糕的做法,假设你不知道实际的实施。

如果实现非常简单,那么它完全符合你的要求 - 即在执行end时关闭或结束连接然后它可能导致相当丑陋的竞争条件,它可能会或可能不会工作取决于机器的负载。

然而,一个引用计数的聪明实现 - 即end实际上并没有关闭连接,只是设置了一个标志 - “当最后一次回调完成然后关闭“ - 然后它可能会起作用。

如果使用引用计数实现它的mysql连接器那么这可能工作正常 - 但这与说你作为插件找到的所有东西都是不错的做法不一样。