Node.js的异步时间过长执行

问题描述:

我有我的查询阵列Node.js的异步时间过长执行

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); 
    } 
}); 
+0

无论您的连接是否建立? – Subburaj

+1

我的数据库服务器连接的数据库服务器一次只能处理最大数量的查询。 –

+0

您应该在第一个函数中执行'return callback(err)'来传播错误,并且只在最后一个函数中处理它们。就像现在一样,'connection.query'中的任何错误都不会传播到最后一个函数。 – Frxstrem

一点清洁剂只要确保你返回响应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()或任何东西。
  • 验证您的数据库query方法实际上只期望2个参数:查询和回调,而不是其间的任何内容(例如查询参数)。
  • 验证这段代码实际上是在您期望的时候调用的。尝试一路调试请求。
  • 目前在这里没有真正的错误处理。如果出现问题,您应该考虑返回HTTP错误。这也应该可以帮助您在将来调试此代码。
+0

同以前一样 - 页面加载永远,并在日志中没有错误 – Rockasaurus

+0

确定。请编辑您的问题,以显示从请求到回复的*完整*相关代码。很难在没有看到代码的情况下猜测你的代码出了什么问题。并且请验证我的答案中的假设是正确的,主要是关于'connection.query'参数数量和这个代码实际上正在执行的事实。 – GilZ

+0

没关系,我已经解决了,你的解决方案是最好的,谢谢! – Rockasaurus

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

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

您的浏览器保存,直到res.end连接被称为!

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

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"); 
    } 

}); 
+0

与以前一样 - 页面加载永远,并在日志中没有错误 – Rockasaurus