2017-01-24 11 views
1

私はすでにこれを行う方法を研究しましたが、私はまだ理解できません。どこが間違っていますか? このタイプの関数を実行する方法を研究しましたが、私のコールバックで答えを得る方法を理解できず、常に他の関数の中に2つの関数があることになりました。Nodejs + Mongooseによるコールバック関数、検索値のみを返す方法は?

コントローラ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; 

モデル

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

    } 


} 

答えて

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

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

respによるのNode.jsが提供非ブロッキング非同期アーキテクチャに定義されていません。

isUserSearchデータを返す関数がまだ終了していない場合、値を記録しようとしている行が実行されます。

コントローラでisUserではなくisUserSearchに既に電話してみましたか?

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, 
} 
+0

、あなたは私がこれを行う正しい方法を知っています。このために特別に勉強する必要があるものは、私に例を挙げてください。ありがとうございました –

+0

例を使って自分の答えを更新しました –

0

あなたが唯一のコールバックでisUserSearch機能を必要としています。 AuthCtrlにコールバックで返されたデータを使用して、あなたが呼ぶこのよう:

コントローラー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; 

コンテキスト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 
     } 
    }); 

} 
関連する問題