Node.js中的异步处理问题

时间:2019-07-30 05:51:04

标签: node.js express

我是nodejs的新手。我正在创建一个基本的API,以获取ID记录。一切正常。它从数据库返回用户数据。但是,当我在同一函数中使用来自响应的密码变量时,它给了我空值,而我在响应中却获得了价值。我认为这是异步问题,但我不知道如何解决。

这是API代码

var express = require('express');
var db = require('../db/database');
var bcrypt = require('bcrypt');

const router = express.Router();

router.get("/:userId", (req, res, next) => {
    let uid = req.params.userId;

    db.query(`SELECT * FROM users WHERE u_id = ${uid}`, (err, data)=> {
        if(!err) {
            if(data && data.length > 0) {
                var message = '';
                if(data.u_password){
                    //var pass = data.u_password;

                    if(bcrypt.compare('123456', data.u_password)) {
                     // Passwords match
                        message = 'Passwords match';
                    } else {
                     // Passwords don't match
                        message = 'Passwords dont match';
                    }
                }
                res.status(200).json({
                    message:message,
                });
            } else {
                res.status(200).json({
                    message:"User Not found."
                });
            }
        } 
    });    
});

database.js

var mysql = require('mysql');

const pool = mysql.createPool({
            connectionLimit : 10,
            host: 'localhost',
            user: 'root',
            password: '',
            database: 'lost_and_found',
            debug    : false 
            });   

function executeQuery(sql, callback) {
    pool.getConnection((err,connection) => {
        if(err) {
            return callback(err, null);
        } else {
            if(connection) {
                connection.query(sql, function (error, results, fields) {
                connection.release();
                if (error) {
                    return callback(error, null);
                } 
                return callback(null, results);
                });
            }
        }
    });
}

function query(sql, callback) {    
    executeQuery(sql,function(err, data) {
        if(err) {
            return callback(err);
        }       
        callback(null, data);
    });
}   

module.exports = {
    query: query
} 

响应

{"message":""}

1 个答案:

答案 0 :(得分:1)

请将bcrypt.compare代码更改为以下代码。 It is a callback功能:

bcrypt.compare('123456', data.u_password, function(err, result) {
    if (err) {
        // Passwords don't match
        message = 'Passwords dont match';
    } else {
        // Passwords match
        message = 'Passwords match';
    }
    res.status(200).json({
        message:message,
    });
})

编辑1:,请将该方法更新为以下逻辑:

db.query(`SELECT * FROM users WHERE u_id = ${uid}`, (err, data) => {
    if (err) {
        throw err;
    }
    if (data && data.length > 0) {
        var message = '';
        if (data.u_password) {
            bcrypt.compare('123456', data.u_password, function (err, result) {
                if (err) {
                    // Passwords don't match
                    message = 'Passwords dont match';
                } else {
                    // Passwords match
                    message = 'Passwords match';
                }
                res.status(200).json({
                    message: message,
                });
            })
        }
        res.status(200).json({
            message: "User Not found."
        });
    }
    res.status(200).json({
        message: "User Not found."
    });
});