【问题标题】:How does async work in Express?异步在 Express 中是如何工作的?
【发布时间】:2017-02-08 12:29:18
【问题描述】:

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

这不应该是不好的做法吗?在我看来,连接有可能在执行查询之前结束。那不会报错吗?

【问题讨论】:

    标签: node.js express asynchronous


    【解决方案1】:

    here 所述:

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

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

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

    这与 mysql 包的作用比 NodeJS 本身更多。

    【讨论】:

    • 当然,但是回调不会发生——这将在end 之后发生——所以我认为这是错误的代码
    • 如果回调没有发生也没关系,当你完成 SQL 操作时调用end(),它不会阻止你之前的查询运行。您是否认为此错误代码取决于您,但它不会像问题中所要求的那样“给出错误”。
    • 那么如果回调代码创建一个新的查询会发生什么?
    • 这种情况下不会,所以不会抛出错误。包的文档中突出显示了其他方法。我发现仅仅因为您不喜欢 mysqljs/mysql 包的做事方式而否决我的答案是不公平的。我只是解释了为什么他的代码有效。我并不是说这是最好的或唯一的做事方式。
    • OPs 的问题是关于这种风格是否是不好的做法。两个 cmets (1) 如果您在回调中提交一个新查询,它会起作用 - 答案将表明它的做法有多好,并且 (2) 您发布的内容没有一个反对票
    【解决方案2】:

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

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

    如果实现真的很简单,它完全按照您的要求执行 - 即在执行end 时关闭或结束连接,那么它可能会导致相当丑陋的竞争条件,它可能会或可能不会工作,具体取决于机器的负载。

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

    如果它使用引用计数实现的 mysql 连接器,那么这可能会很好地工作——但这​​并不等同于说它对你作为插件找到的所有东西都是很好的做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 2020-12-27
      • 2011-05-02
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多