javascript - SQL 查询的结果未传递给 Node Js Promise 中的 resolve()

标签 javascript mysql node.js

所以我认为我这样做是对的,但我想不是。我正在尝试将查询结果传递给 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 不会。在这种情况下,解析 ArrayObject 是一种很好的做法。如果您使用 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/

相关文章:

mysql - Sql匹配另一个表中的id并连接

java - 如何在Mac上更改MySQL的character_set_server

javascript - node.js连接mysql数据库出错

javascript - 无法从 fetch PUT 访问 Express 服务器的正文数据

javascript - 使用 p :tabMenu with JavaScript

javascript - 在Javascript中,同步处理列表

php - 第 30 行的可捕获 fatal error : Object of class PDOStatement could not be converted to string in/home/refined/public_html/refer. php

node.js - 判断预保存回调中是否有记录 "is new"

javascript - 对象的 JSON 数组。根据名称对对象值进行分组

javascript - Javascript 中的 NaN