[英]How does async work in Express?
我在ExpressJS 指南中发现了以下内容:
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();
这不应该是不好的做法吗? 在我看来,连接有可能在执行查询之前结束。 那不会报错吗?
如前所述这里:
您在连接上调用的每个方法都会排队并按顺序执行。
关闭连接是使用 end() 完成的,它确保在向 mysql 服务器发送退出数据包之前执行所有剩余的查询。
因此,即使可以在查询完成之前调用end()
方法,它也不会在查询完成执行之前实际执行。
这与mysql
包比 NodeJS 本身有更多关系。
您的问题async 在 Express 中是如何工作的? 这不应该是不好的做法吗? 可以通过多种方式回答,但为了清楚起见,我想解释一下这取决于!!!!
假设您不知道实际实现,这通常是非常糟糕的做法。
如果实现真的很简单,它完全按照您的要求执行 - 即在执行end
时关闭或结束连接,那么它可能会导致相当丑陋的竞争条件,根据机器的负载它可能会或可能不会工作.
然而,一个进行引用计数的聪明实现——即end
实际上并没有关闭连接,而只是设置一个标志来说明——“当最后一个回调完成后关闭”——那么它可能会起作用。
如果它使用引用计数来实现 mysql 连接器,那么这可能会很好地工作 - 但这并不等于说它是作为插件找到的所有东西的好习惯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.