在Node.JS / NPM的MySQL库中使用带有查询的Promise

时间:2018-05-31 23:50:21

标签: javascript mysql node.js asynchronous promise

我正在使用带有Node.JS的mysql NPM库,并且我尝试查询数据库并让函数返回Promise而不需要回调。以下是我尝试过的内容:

index.js:

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

asyncQuery.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 Library,但我不确定它是否支持Promise 回调查询。如果确实如此,请告诉我,我会试一试。

NodeJS版本:9.1.0

NPM版本:5.5.1

NPM的MySQL库版本:2.15.0

2 个答案:

答案 0 :(得分:2)

确切的查询有效并且不会触发该错误,您可能有一个包含多个占位符的更复杂的查询,例如:

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已经包含promise wrapper并且速度比mysql更快的包,其好处是具有几乎相同的API。

答案 1 :(得分:0)

您可以使用npmjs中的 mysql-promise 包,它可以作为mysql和mysql2的包装器: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); });