目标:制作多个MySQL调用
我试图让使用这样一个查询的结果作为“mysql的”模块中的Node.js多个SQL查询输入下一个语句。
sql1 = SELECT id FROM users WHERE email=? // get user id from email
val1 = [email protected]
sql2 = SELECT something FROM profiles WHERE user_id=?
val2 = user_id // result of sql1
做法:
我使用的是JS “承诺” 来实现这一目标:
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=?' , ['[email protected]'] ]).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承诺结构使用mysql节点模块?
您可能想要使用类似[Sequelize](http://docs.sequelizejs.com/en/v3/)的支持开箱即用的承诺,而不是将自己的包装破解在一起。 – tadman