我想在像这样的nodejs中运行同步查询...
createProdRoute
在这个代码块中,我的行始终为null ...我想运行同步查询
答案 0 :(得分:3)
您可能无法在线程阻塞意义上同步使用此类函数(也不应该!)但如果您使用数据库连接的promise版本(使用Bluebird' s),您可能会接近这一点! promisify可以在npm上使用的所有或特定的mysql驱动程序的承诺版本)和新的async / await语法(或者比没有async / await的Node 7.x更早的平台的基于生成器的协同程序 - 另一种选择是使用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);
有关该主题的更多详细信息,请参阅:
注意 - 它只能在使用async
关键字声明的函数内部使用。
警告词:您的代码可能容易受到SQL注入攻击。您应该在SQL中使用占位符而不是字符串连接。我没有修复代码的这一方面 - 请参阅这些答案以获取更多详细信息:
答案 1 :(得分:0)
您应该使用bluebird
npm
module
来解决此问题。使用npm install bluebird
安装bluebird
var Promise = require('bluebird');
var Rows= [];
data.forEach(function (obj) {
conn.query("Select 1 from user where userid="+obj.id,function(err,row){
Rows.push(row);
});
});
return Promise.all(Rows);
})
答案 2 :(得分:0)
您也可以使用异步模块。
node_modules/.bin/webdriver-manager update // get the latest
答案 3 :(得分:0)
您可以制作一个返回Promise的包装器。使用await
可以使其同步:
function promiseWrapper() {
return new Promise((resolve, reject) => {
conn.query("SQL_QUERY", queryCallback(resolve, reject);
}
}
function queryCallback(err, row){
return (resolve, reject) {
resolve(row);
}
}