繁体   English   中英

异步如何在 Express 中工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM