【问题标题】:Node.js async taking too long to executeNode.js 异步执行时间过长
【发布时间】:2017-11-07 11:41:42
【问题描述】:

我有我的查询数组

var array = [ 'UPDATE EVALUATION SET mark = "16" WHERE id_eval = "21" AND id_usr = "125"', 
              'UPDATE EVALUATION SET mark = "9" WHERE id_eval = "22" AND id_usr = "125"', 
              'UPDATE EVALUATION SET mark = "8" WHERE id_eval = "34" AND id_usr = "125"' 
            ]

但是,当我尝试使用异步方式一次执行所有操作时,我的网页显示 Waiting for localhost... 并且它会一直加载。我做错了什么?

async.forEach(array, function(query, callback) {
    connection.query(query, function(err, rows, fields) {
        if(err) {
            return console.error(err);
        }

        callback();
    });
}, function(err){
    if(err) {
        return console.log(err);
    }
});

【问题讨论】:

  • 你的连接是否建立??
  • 你连接的数据库服务器一次只能处理最大数量的查询。
  • 你应该在你的第一个函数中使用return callback(err) 来传播错误,并且只在最后一个函数中处理它们。就像现在一样,connection.query 中的任何错误都不会传播到最后一个函数。
  • 另外,请检查您的控制台是否有错误。
  • 首先:你应该真的做一个return callback(err)如果有什么失败,并在最后一个块中记录你的错误。第二:不要忘记调用res.end()或类似的方式来退出HTTP连接。

标签: javascript node.js async.js


【解决方案1】:

只需确保在调用 forEach 回调后返回响应即可:

async.forEach(array, function(query, callback) {
    connection.query(query, function(err, rows, fields) {
        if(err) {
            console.error(err);
        }

        callback();
    });
}, function(err){
    if(err) {
        console.log(err);
    }

    res.redirect('/next-page');
});

这样,重定向只会在所有查询结束时发生。

您应该验证的一些事项:

  • 验证您在上述代码之前没有调用res.end()res.redirect() 或类似的东西。
  • 验证您的 DB query 方法实际上只需要 2 个参数:查询和回调,而不是介于两者之间的任何参数(例如查询参数)。
  • 验证这段代码是否在您期望的时候被调用。尝试一直调试请求。
  • 目前这里没有真正的错误处理。如果出现问题,您应该考虑返回 HTTP 错误。这也应该有助于您将来调试此代码。

【讨论】:

  • 和以前一样 - 页面永远加载并且日志中没有错误
  • 好的。请编辑您的问题,以显示从请求到响应的完整相关代码。没有看到它很难猜出你的代码有什么问题。请验证我的回答中的假设是否正确,主要是关于connection.query 参数数量以及该代码实际正在执行的事实。
  • 没关系,我已经解决了,你的解决方案是最好的,谢谢!
【解决方案2】:

通常你有一个这样的请求处理程序:

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

在调用res.end之前,您的浏览器会保持连接!

在您的环境中,它应该看起来像

const server = http.createServer((req, res) => {

  // ... 
  async.forEach(array, function(query, callback){
    connection.query(query, function(err, rows, fields) {
        // you may do some work here but leave it *alyways* via callback!
        callback(err);
    });
  }, function(err){
    if(err){ // this may be errors from above
      return console.log(err);
    }
    // Exit here !
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('All done.\n');
  });
});

...或者更干净一点

function doSomeDatabaseUpdates(onFinished) {
  var array = [...];
  async.forEach(array, function(query, callback){
    connection.query(query, function(err, rows, fields) {
        // you may do some work here but leave it *alyways* via callback!
        callback(err);
    });
  }, 
  function IGetCalledAfterAboveCallbackWereExecuted(err){
    if(err){ // this may be errors from above
      return console.log(err);
    }
    // Exit here !
    onFinished();
  });
}


const server = http.createServer((req, res) => {

  // ... do some work

  if (doSomeUpdated === true) {
    doSomeDatabaseUpdates(function calledAfterUpdates() {
      res.end("updates something");
    });
  } else {
    res.end("nothing to do");
  }

});

【讨论】:

  • 和以前一样 - 页面永远加载并且日志中没有错误
猜你喜欢
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2023-03-16
相关资源
最近更新 更多