javascript – NodeJS mysql同步查询

我想在这样的nodejs中运行同步查询…

for (var i in data){

conn.query("Select 1 from user where userid="+data[i].id,function(err,row){
     Rows.push(row);
});

}

console.log(Rows);

在这个代码块中,我的行一直都是null …我想运行同步查询

解决方法:

您可能无法在线程阻塞意义上同步使用此类函数(也不应该!)但如果您使用数据库连接的承诺版本(使用Bluebird的promisifyAll或特定的承诺版本),您可能会接近这一点! npm上可用的mysql驱动程序)和新的async / await语法(或基于生成器的协程,用于早于Node 7.x的平台,其中async / await不可用 – 另一种选择是使用Babel进行转换).

示例 – 您可以使用如下代码:

for (var i in data) {
  let row = await conn.query("Select 1 from user where 
  userid="+data[i].id);
  Rows.push(row);
}
console.log(Rows);

但如果它可以并行运行,那么类似的东西会更有效,更短:

let Rows = await Promise.all(data.map(item =>
  conn.query("Select 1 from user where userid=" + item.id));
console.log(Rows);

有关该主题的更多详细信息,请参阅:

> Do async in a blocking program language way?
> Using async/await + Bluebird to promisifyAll
> try/catch blocks with async/await
> Using acyns/await in Node 6 with Babel
> jQuery: Return data after ajax call success

注意 – 它只能在使用async关键字声明的函数内部使用.

警告:您的代码可能容易受到SQL注入攻击.您应该在SQL中使用占位符而不是字符串连接.我没有解决您的代码问题 – 请参阅这些答案以获取更多详细信息:

> cannot use backtick when using nodejs 7.3.0
> Node.js – The multi part could not be bound
> How to escape mysql special characters with sockets.io/node.js/javascript
> Node js – Promise Rejection Warning when process a lot of data
> Is it possible to listen for object instantiation in Node.js?

上一篇:采访问:Java同步


下一篇:java – 巨大数据模型中的线程安全性