2016-09-30 50 views
1

我发现了ExpressJS guide如下:异步在Express中如何工作?

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(); 

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

回答

1

如前所述here

  • 你的连接上调用的每个方法进行排队并依次执行。

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

因此,即使可以查询完成之前进行调用的end()方法,它实际上不会执行,直到查询已完成执行。

对于mysql包,这必须比NodeJS本身做得更多。

+0

当然,但回调不会有发生 - 这将发生在'结束'后 - 所以我会认为这是不好的代码 – Soren

+0

没有关系,如果回调没有发生,你打电话'end()'当你完成SQL操作时,它不会阻止你以前的查询运行。无论是否你认为这个糟糕的代码取决于你,但它不会像问题中提到的那样“给出一个错误”。 – Drown

+0

那么如果回调代码创建一个新的查询会发生什么? – Soren

0

您的问题异步在Express中如何工作?这不应该是不好的做法?可以用很多方式回答,但为了清晰起见,我想解释一下,这取决于!

一般是非常不好的做法,假设你不知道实际执行。

如果这个实现非常简单,那么它的确如你所要求的那样 - 即当执行end时关闭或结束连接,那么它可能会导致相当丑陋的竞争条件,它可能会或可能不会工作,具体取决于机器的负载。

然而,一个聪明的实现,它引用计数 - 这是end实际上并不关闭连接,但只是设置一个标志说 - “时的最后一个回调完成后关闭” - 那么它可能工作。

如果它使用引用计数实现的mysql连接器,那么这可能会正常工作 - 但这不同于说作为插件找到的所有内容都是很好的做法。