【问题标题】:Callback function with Nodejs + Mongoose, How to return only the search value?Nodejs + Mongoose的回调函数,如何只返回搜索值?
【发布时间】:2017-01-24 22:16:20
【问题描述】:

我已经研究过如何做到这一点,但我仍然无法理解,我哪里出错了? 我研究了如何执行这种类型的函数,但我不明白如何在我的回调中得到答案,最终总是在另一个函数中有 2 个函数。

控制器用户Ctrl

    // Models
    var User = require('../models/user');

    var isUserSearch = function(email,callback){

        User.find({email:email},function(err,data){
            if(err) throw err;
            return callback(data);
        });

    }

    var isUser = function(email){

        var resp = isUserSearch(email,function(data){
            return data;
            console.log(data); // I get my data 
        });

        console.log("Response : " + resp); // undefined

        return resp;

    }

    var result = {
        gerarToken : gerarToken,
        isUser : isUser,
    }

    module.exports = result;

型号

// Model
var mongoose = require('mongoose');

// Schema
var Schema = mongoose.Schema({
    name : {
        type : String,
        require : true
    },
    email : {
        type : String,
        require : true,
        unique : true
    },
    password : {
        type : String,
        required : true
    },
    type : {
        type : Number,
        required : true,
        default : 1
    },
    created : {
        type : Date,
        default : Date.now
    }
});

var Data = mongoose.model('User', Schema);

module.exports = Data;

上下文 AuthCtrl

// Controllers

var Crypto = require('./cryptoCtrl');

var User = require('./UserCtrl');

// ----------- Login
var login = function(req,res){
    var data = req.body;
    var email = data.email;
    var password = Crypto.cryptoString(data.password);

    var existUser = User.isUser(email);

    if(existUser){

        // IsUser is a function to return the user array 
        // if it exists, otherwise it returns only a false 
        // boolean value. In the example I'm going to use this function

    }


}

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:
    var resp = isUserSearch(email,function(data){
      return data;
      console.log(data); // I get my data 
    });
    
    console.log("Response : " + resp); // undefined
    

    resp 由于 非阻塞异步架构 node.js 提供而未定义。

    当返回数据isUserSearch 的函数尚未完成时,将执行您尝试记录值的行。

    您是否已经尝试在控制器中调用isUserSearch 而不是isUser

    var login = function(req,res){
        var data = req.body;
        var email = data.email;
        var password = Crypto.cryptoString(data.password);
    
        User.isUser(email, function(existUser) {
           if(existUser){
              console.log('User exist', existUser);
            // IsUser is a function to return the user array 
            // if it exists, otherwise it returns only a false 
            // boolean value. In the example I'm going to use this function
           } else {
              console.log('User does not exist');
           }
        });
    }
    

    然后你可以删除isUser并更改:

    var result = {
        gerarToken : gerarToken,
        isUser: isUserSearch,
    }
    

    【讨论】:

    • 我开始明白了,你知道我这样做的正确方法。我需要专门为此学习什么,你能给我举个例子吗?谢谢
    【解决方案2】:

    您只需要带有回调的isUserSearch 函数。在AuthCtrl 中使用回调中返回的数据,您将其称为:

    控制器用户Ctrl

    // Models
    var User = require('../models/user');
    
    var isUserSearch = function(email, callback){
        /* use findOne() which returns a single document that you can check if null */
        User.findOne({email: email}, function(err, user){ 
            if (err) throw err;
            return callback(!!user); // return a callback with a Boolean value as argument
        });
    }
    
    var result = {
        gerarToken : gerarToken,
        isUser: isUserSearch,
    }
    
    module.exports = result;
    

    上下文 AuthCtrl

    // Controllers
    
    var Crypto = require('./cryptoCtrl');
    
    var User = require('./UserCtrl');
    
    // ----------- Login
    var login = function(req, res){
        var data = req.body;
        var email = data.email;
        var password = Crypto.cryptoString(data.password);
    
        /* Call the isUser function with a callback */
        User.isUser(email, function(userExists){
            if (userExists) {
                // userExists is a boolean value
            }
        });
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 2011-11-13
      • 1970-01-01
      • 2019-07-25
      • 2021-06-01
      • 2019-08-16
      • 2016-10-08
      • 1970-01-01
      相关资源
      最近更新 更多