我在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();
这不应该是不好的做法吗?我看到它的方式,可以在执行查询之前结束连接。不会出错吗?
答案 0 :(得分:1)
您在连接上调用的每个方法都会按顺序排队并执行。
使用end()关闭连接,确保在将退出数据包发送到mysql服务器之前执行所有剩余的查询。
因此,即使可以在查询完成之前调用end()
方法,但在查询完成执行之前,它实际上不会被执行。
这需要使用mysql
包而不是NodeJS本身。
答案 1 :(得分:0)
您的问题异步如何在Express中工作?和这不应该是不好的做法吗?可以通过多种方式回答,但为了清楚起见,我希望解释取决于!!!!
一般是非常糟糕的做法,假设你不知道实际的实施。
如果实现非常简单,那么它完全符合你的要求 - 即在执行end
时关闭或结束连接然后它可能导致相当丑陋的竞争条件,它可能会或可能不会工作取决于机器的负载。
然而,一个引用计数的聪明实现 - 即end
实际上并没有关闭连接,只是设置了一个标志 - “当最后一次回调完成然后关闭“ - 然后它可能会起作用。
如果使用引用计数实现它的mysql连接器那么这可能工作正常 - 但这与说你作为插件找到的所有东西都是不错的做法不一样。