javascript - 在 Node.JS/NPM 的 MySQL 库中使用 Promise 和查询
问题描述
我正在将mysql
NPM 库与 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
解决方案
该确切查询有效并且不会触发该错误,您可能有一个带有多个占位符的更复杂的查询,例如:
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 的好处。
推荐阅读
- python - 如何使用登录的用户名在 Python Django 帖子上添加评论?
- powershell - 在 powershell 中转义 $
- ag-grid - 以编程方式删除所有分组和过滤的简单方法
- linux - while循环比较文件
- python - 当我尝试使用 arff.dump() 将 pandas DataFrame 文件保存到 arff 时,为什么会显示错误?
- python - Plotly 密度热图格式化色阶和悬停文本
- python - Python Requests-HTML - 找不到特定数据
- c# - TabControl 不显示基于视图模型类型的内容
- c - C中是否有一个函数可以取变量的最大整数值?
- html - 在 HTML 中的文本之间添加水平线