首页 > 解决方案 > 在 Node.JS/NPM 的 MySQL 库中使用 Promise 和查询

问题描述

我正在将mysqlNPM 库与 Node.JS 一起使用,并且我正在尝试查询数据库并让函数返回 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)
        })
      }
    })
  }
}

如果没有传递任何变量/参数??

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

标签: javascriptmysqlnode.jsasynchronouspromise

解决方案


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

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 包装器的包,它比 更快mysql,具有几乎相同的 API 的好处。


推荐阅读