回调不是函数(但它是)

时间:2019-01-04 03:49:42

标签: javascript node.js typescript

这可能是一个简单的问题,因为我不了解回调的概念(我以为我知道,但显然没有)。

我正在尝试从MySQL返回响应(除了使用nodeJS以外,几乎所有语言都可以轻松完成此操作):

我正在从路由文件中调用一个函数:

路线

const user = require('../models/Users');

router.post('/register', (req, res, next) => {
    let newUser = {
        username: req.body.username,
        password: req.body.password
    };
    if(user.checkIfUserExists) {
        // do something
    }
});

这是另一个文件中的查询:

const mysql = require('../handlers/mysql');
const bcrypt = require('bcrypt-nodejs');
var User = {
    checkIfUserExists: function(newUser, callback) {
        mysql.query('SELECT * FROM users where Email like ?', [newUser.username], function(err, result) {
            if(err) return callback(err);
            callback(null, result > 0);
        });    
    },

    registerUser: function(newUser) {
        mysql.query("INSERT INTO users (Email, Password) VALUES (?, ?)", [newUser.username, User.hashPassword(newUser.password)], function(err, results) {
            if (err) throw err;
            return true;
        });
    },

    hashPassword: function(password) {
        let salt = bcrypt.genSaltSync(10);
        return bcrypt.hashSync(password, salt);
    }    
}
module.exports = User;

当然,registerUser会发生同样的事情

3 个答案:

答案 0 :(得分:7)

您忘了调用和处理回调。

user.checkIfUserExists(newUser, function(arg1, isUserExist) { 
    if (isUserExist) {
       //user exist
    }
});

答案 1 :(得分:0)

您没有使用回调。为此,请遵循以下代码。

   `user.checkIfUserExists(newUser,(result)=>{
       If(result){
         //write your code  
         }
      }`

答案 2 :(得分:-1)

许多人向您解释了问题。让我向您解释回调的概念。

回调是在函数完成其工作之后被调用的函数 例如,此功能

setTimeout(function(){
    alert('Alert will be ran after 3 seconds');
},3000);

您可以打开开发人员模式(在浏览器中按f12并运行它)。您可以看到警报框将在3秒后显示。我可以解释这样的代码流程。

  1. setTimeout函数正在运行。该函数将在3000毫秒后完成,然后将运行回调函数
  2. 3000毫秒后,将调用回调函数。这样便显示了警报框。

在您的代码中,您只是创建一个普通的新对象,它没有来自User对象的checkIfUserExists函数。您必须从User类创建用户。

回调函数给初学者带来了很多麻烦,这就是为什么在ES6 +(JavaScript版本6+)中。引入了class,async,await,使生活更轻松。