目标:
我正在尝试使用 Node.js 中的“mysql”模块进行多个 SQL 查询,以便将一个查询的结果用作下一条语句的输入。
sql1 = SELECT id FROM users WHERE email=? // get user id from email
val1 = test@email.com
sql2 = SELECT something FROM profiles WHERE user_id=?
val2 = user_id // result of sql1
方法:
我使用 JS“promise”来实现此目的:
var run_query = function(conn,sql){
return new Promise(function (fulfill, reject){
conn.query(sql, val, function(err, res) {
if(err) reject(err);
else fulfill(res);
});
});
}
var conn = db.config(mysql);
run_query(conn,[ 'SELECT id FROM users WHERE email=?' , ['test@email.com'] ]).then(function(result){
console.log(result.id); // result of 1st query
return run_query(conn,[ 'SELECT something FROM profiles WHERE user_id=?' , [result.id] ]);
}).then(function(result){
console.log(result.something); // result of 2nd query
}).catch(function(err){
console.log('there was an error', err);
});
conn.end();
问题:
第一个查询返回正确的结果,但第二个查询从 mysql 模块抛出以下错误:
Error: Cannot enqueue Query after invoking quit.
~blah blah blah~
code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false
我尝试解决的问题:
我相信这与连接打开时进行的多次调用以及最后调用 conn.end(); 有关。我稍微移动了它,但没有用。
我尝试为 mysql 模块打开多个语句
var conn = mysql.createConnection({multipleStatements: true});
..但这也不起作用。
如何使用具有 JS Promise 结构的 mysql Node 模块?
最佳答案
您正在使用 Promise,但 Promise 代码是 synchronse ,外部代码是 asynchrse 。因此 conn.end 在第二个查询之前运行。
在第二个.then block 中使用conn.end
,如下所示
并删除外部 conn.end
:
var conn = db.config(mysql);
run_query(conn,[ 'SELECT id FROM users WHERE email=?' ,
['test@email.com'] ]).then(function(result){
console.log(result.id); // result of 1st query
return run_query(conn,[ 'SELECT something FROM profiles WHERE
user_id=?' , [result.id] ]);
}).then(function(result){
console.log(result.something); // result of 2nd query
conn.end();
}).catch(function(err){
console.log('there was an error', err);
});
关于javascript - 在 Node.js 中使用 JS Promise 进行多个 mysql 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40816561/