[英]Using Promises with Queries with Node.JS/NPM's MySQL Library
我正在将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)
})
}
})
}
}
如果没有传递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
该确切的查询有效并且不会触发该错误,您可能有一个带有多个占位符的更复杂的查询,例如:
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的好处。
您可以使用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); });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.