所以我认为我这样做是对的,但我想不是。我正在尝试将查询结果传递给 then()
中的函数。我有一个 console.log()
从这两个函数内部记录结果。第一个吐出它应该的结果。第二个是给我undefined
,我不知道我做错了什么。
var dbConnect = () => new Promise(
(res, rej) => {
var connection = mysql.createPool(Config.mariaDBCred);
connection.getConnection((err, connection) => {
if(err) return rej(err);
return res(connection);
});
}
);
var dbQuery = (connection, queryString, paramArray) => new Promise(
(res, rej) => {
var sql = mysql.format(queryString, paramArray);
connection.query(sql,
(err, results, fields) => {
connection.release();
console.log(results); //THIS DISPLAYS RESULTS FROM THE QUERY CORRECTLY
if(err) return rej(err);
return res(results, fields);
}
);
}
);
//CHECK IF EMAIL EXISTS
module.exports.doesEmailExist = (email, callback) => {
dbConnect().then(
(connection) => {
dbQuery(
connection,
'SELECT `id`, `password_hash` FROM `users` WHERE email = ?',
[email]
)
}
).then(
(results, fields) => {
console.log(results); //THIS DISPLAY UNDEFINED
if(results.length > 0) return callback(true, results);
return callback(false, "Email does not exist.");
}
).catch(
(reason) => {
console.log(reason);
return callback(false, "Internal Error");
}
);
}
最佳答案
我不确定下面的修改是否能解决您的所有问题,但就您与 Promise
API 相关的问题而言,它们应该会引导您朝着正确的方向前进。
首先,在 dbQuery
函数中,我解析了一个对象,因为您只能解析 promise 中的单个值。
其次,要链接 promise ,您必须返回 promise 。在您的第一个 then
处理程序中,您没有从 dbQuery
(在 dbConnect
之后)返回 Promise
。
最后,我更改了您的第二个 then
处理程序以处理单个已解析对象,而不是之前使用的多个参数。以前,如果一切正常,results
会被定义,但 fields
不会。在这种情况下,解析 Array
或 Object
是一种很好的做法。如果您使用 es6,对象/数组解构可以简化此操作。
另一个注意事项。如果您正在使用 Promises,请考虑放弃在 doesEmailExist
函数中实现的回调模式,如果不是完全放弃的话。它更加一致,您不必包装 catch
处理程序,除非针对特定的错误情况。值得深思。
var dbConnect = () => new Promise(
(res, rej) => {
var connection = mysql.createPool(Config.mariaDBCred);
connection.getConnection((err, connection) => {
if(err) return rej(err);
return res(connection);
});
}
);
var dbQuery = (connection, queryString, paramArray) => new Promise(
(res, rej) => {
var sql = mysql.format(queryString, paramArray);
connection.query(sql,
(err, results, fields) => {
connection.release();
console.log(results); //THIS DISPLAYS RESULTS FROM THE QUERY CORRECTLY
if(err) return rej(err);
// return res(results, fields); NOPE, can only resolve one argu
return res({ results: results, fields: fields }) // resolve an object
}
);
}
);
//CHECK IF EMAIL EXISTS
module.exports.doesEmailExist = (email, callback) => {
dbConnect().then(
(connection) => {
// Return the promise from `dbQuery` call
return dbQuery(
connection,
'SELECT `id`, `password_hash` FROM `users` WHERE email = ?',
[email]
)
}
).then(
(response) => {
// Can only resolve one argument
var results = response.results;
var fields = response.fields;
console.log(results); //THIS DISPLAY UNDEFINED
if(results.length > 0) return callback(true, results);
return callback(false, "Email does not exist.");
}
).catch(
(reason) => {
console.log(reason);
return callback(false, "Internal Error");
}
);
}
关于javascript - SQL 查询的结果未传递给 Node Js Promise 中的 resolve(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42546875/