javascript - 在 Node.js 中使用 JS Promise 进行多个 mysql 调用

标签 javascript mysql node.js promise

目标:

我正在尝试使用 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/

相关文章:

mysql - 哪种方法更好地连接 mysql 表?

javascript - 一次按数字对值排序,第二次按字符串排序

javascript - 表示由 HTML5 FileReader 读取的图像

javascript - 基本 jQuery slider 中上一张/下一张幻灯片的自定义链接触发器

javascript - 使用javascript强制图像缓存

javascript - 从数据库打印 PHP 表

php - MySQL 连接速度与 PHP 文件访问速度

javascript - 如何使用for of循环获取对象的值

javascript - 如何将 mysql 的 datediff 与 sequelizejs 一起使用

node.js - Postgres 服务器没有响应 nodejs 请求