SQL查询的结果没有传递给Node Js Promise中的resolve()

所以我认为我是这样做的,但我猜不是。 我试图将查询的结果传递给then()的函数。 我有两个函数内的console.log()日志logging结果。 第一个应该是吐出结果。 第二个是给我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函数中,我parsing了一个对象,因为你只能parsing一个promise中的一个值。

其次,为了链接承诺,你必须回复承诺。 在你的第一个处理程序中,你没有从dbQuery返回Promise (在dbConnect之后)。

最后,我改变了你的第二个处理程序来处理单个parsing对象,而不是之前使用的多个参数。 以前,一切正常, results将被定义,但不是fields 。 在这种情况下解决一个ArrayObject是一个很好的习惯。 如果你使用es6,对象/数组解构使得这一点变得容易。

另一个说明。 如果您使用doesEmailExist ,请考虑在您的doesEmailExist函数中实施callback模式,如果不是这样的话。 这是更一致的,你不必包装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"); } ); }