初始代码如下:
sqlQuery.queryInfo( "ev_users", ["username"], { username: "'" + user.username + "'", });
async function queryInfo(tableName, content, condition) {
// 判断查询内容
let contentStr = "*";
if (content && content != []) {
contentStr = content.join(",");
}
let conditionArr = [];
if (condition && condition != {}) {
for (let key in condition) {
if (condition[key]) {
conditionArr.push(key + "=" + condition[key]);
}
}
}
//sql查询语句
let sqlStr = "select " + contentStr + " from " + tableName + " where " + conditionArr.join(" and ");
// 定义变量接受查询结果
let errInfo = null
let resultInfo = null
await db.query(sqlStr, (err, results) => {
errInfo = err
resultInfo = results
});
// 返回查询结果
return {err: errInfo, results: resultInfo}
}
一开始只使用了 async 和 await,发现不起效果,查询返回的结果是
[ Promise { <pending> } ]
解决方法1: 使用 callback 回调函数
sqlQuery.queryInfo( "ev_users", ["username"],
{
username: "'" + user.username + "'",
},
function (err, data) {
// 回调函数
if (err) {
return res.send({
status: "",
success: false,
msg: "查询失败",
});
}
if (data && data.length > 0) {
return res.send({
status: "",
success: false,
msg: "用户名已存在,请重新输入",
});
}
}
);
function queryInfo(tableName, content, condition, callback) {
// 判断查询内容
let contentStr = "*";
if (content && content != []) {
contentStr = content.join(",");
}
let conditionArr = [];
if (condition && condition != {}) {
for (let key in condition) {
if (condition[key]) {
conditionArr.push(key + "=" + condition[key]);
}
}
}
let sqlStr = "select " + contentStr + " from " + tableName + " where " + conditionArr.join(" and ");
db.query(sqlStr, (err, results) => {
callback(err, results);
});
}
将查询结果传递给回调函数,最终可以返回正确的查询结果
解决方法2:使用 Promise 和 (async + await)
// 处理登录请求
async function login(req, res) {
let user = req.body;
let queryRes = await sqlQuery.queryPromise("ev_users", null, {
username: "'" + user.username + "'",
});
}
/**
*
* 使用 promise 和 (async + await) 等待sql语句执行完毕
*
*
*/
// 查询语句
async function queryPromise(tableName, content, condition, callback) {
// 判断查询内容
let contentStr = "*";
if (content && content != []) {
contentStr = content.join(",");
}
let conditionArr = [];
if (condition && condition != {}) {
for (let key in condition) {
if (condition[key]) {
conditionArr.push(key + "=" + condition[key]);
}
}
}
let sqlStr = "select " + contentStr + " from " + tableName + " where " + conditionArr.join(" and ");
// 使用promise
let res = await new Promise((resolve, reject) => {
db.query(sqlStr, (err, results) => {
resolve({
err: err,
results: results,
});
});
});
return res;
}