2017-01-24 3 views
1

Ich habe bereits recherchiert, wie das geht, aber ich kann immer noch nicht verstehen, wo ich falsch liege? Ich recherchierte, wie man diese Art von Funktion macht, aber ich konnte nicht verstehen, wie man eine Antwort in meinem Rückruf erhält, immer am Ende mit 2 Funktionen innerhalb der anderen.Rückruffunktion mit Nodejs + Mongoose, Wie wird nur der Suchwert zurückgegeben?

-Controller UserCtrl

// 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; 

Modell

// 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; 

Kontext 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 

    } 


} 

Antwort

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

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

resp undefiniert aufgrund nicht blockierenden asynchrone Architektur node.js bereitzustellen.

Die Zeile, die Sie versuchen, den Wert zu protokollieren, wird ausgeführt, wenn die Funktion, die die Daten isUserSearch zurückgibt, noch nicht fertig ist.

Haben Sie bereits versucht, isUserSearch statt isUser in Ihrem Controller aufzurufen?

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'); 
     } 
    }); 
} 

Dann können Sie isUser entfernen und ändern:

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

Ich beginne zu verstehen, Du kennst den richtigen Weg für mich, dies zu tun. Was muss ich speziell dafür lernen, können Sie mir ein Beispiel geben? Danke –

+0

Ich aktualisierte meine Antwort mit einem Beispiel –

0

Sie müssen nur die isUserSearch Funktion mit dem Rückruf. Verwenden Sie die zurückgegebenen Daten in einem Rückruf in der AuthCtrl und Sie nennen dies als:

-Controller UserCtrl:

// 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; 

Kontext 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 
     } 
    }); 

} 
Verwandte Themen