在node.js/npm的mysql库中使用promises查询

kx1ctssn  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(528)

我用的是 mysql 带有node.js的npm库,我正在尝试查询数据库,让函数返回一个承诺,而不需要回调。以下是我尝试过的:
索引.js:

var result = await asyncQuery.main(connection, "SELECT * FROM tbl WHERE id = ?", "1234567890")

异步查询.js:

var colors = require('colors')

module.exports = {
  main: function(con, q, vars) {
    return new Promise((resolve, reject) => {
      if (!vars) {
        con.query(q, function (err, result) {
          if (err) {
            console.log(colors.red(err.stack))

            return reject(err);
          }
          resolve(result)
        })
      }
      else {
        con.query(q, vars, function (err, result) {
          if (err) {
            console.log(colors.red(err.stack))

            return reject(err);
          }
          resolve(result)
        })
      }
    })
  }
}

如果未传递vars/args,则此操作正常( ? ),但一年一次 ? 使用时,我得到一个错误:

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

如果我运行一个带有回调的常规查询,这将非常好地工作。有点不对劲 asyncQuery.js ,但我不确定是什么问题。
有没有人对这段代码有修复方法,或者有更简单的方法来实现我的目标?我听说过promise mysql库,但我不确定它是否支持promise和回调查询。如果有,告诉我,我会试试的。
nodejs版本:9.1.0
npm版本:5.5.1
npm的mysql库版本:2.15.0

eqqqjvef

eqqqjvef1#

您可以使用npmjs提供的mysql promise包,它可以作为mysql和mysql2的 Package 器:https://www.npmjs.com/package/mysql-promise
用法示例:

var db = require('mysql-promise')();

db.configure({
    "host": "localhost",
    "user": "foo",
    "password": "bar",
    "database": "db"
});

db.query('UPDATE foo SET key = ?', ['value'])
.then( function(){ return db.query('SELECT * FROM foo'); })
.spread(function (rows) { console.log('Loook at all the foo', rows); });
cnjp1d6j

cnjp1d6j2#

准确的查询工作正常,不会触发该错误,您可能有一个更复杂的查询,其中包含多个占位符,例如: SELECT * FROM tbl WHERE id = ? or ref_id = ? ,
在这种情况下,您将需要发送一个包含尽可能多的值的数组,而不是发送一个字符串 ? 你有。
所以发送: ["1234567890", "1234567890"] 而不是上面查询的字符串。
此外,您的方法可以简化为:

module.exports = {
    main(con, q, vars) {
        return new Promise((resolve, reject) => {
            con.query(q, vars, function(err, result) {
                if (err) {
                    console.log(colors.red(err.stack))

                    return reject(err);
                }
                resolve(result)
            })
        })
    }
}

允许你放下 if/else .
就我个人而言,我更喜欢 mysql2 包已经有一个承诺 Package ,它的速度比 mysql ,具有几乎相同的api的好处。

相关问题