2013-11-10 2 views
1

Я работаю над частью регистрации, которая выполняет некоторую проверку на стороне сервера, прежде чем вводить данные в mongo. Я очень новичок в mongoose, и у меня возникают проблемы с возвратом данных в метод, который завершает весь процесс регистрации.Как вернуть значения из запроса Mongoose

В моем контроллере локомотива у меня есть метод, который завершает все, чтобы начать процесс регистрации.

auth = new Authenticator(); 
auth.signUp(this.req.body); 

Внутри моего объекта auth signUp просто выполняется проверка данных перед созданием нового пользователя. Одна проверка состоит в том, что в базе данных уже нет дублированного письма.

this.signUpUser = function(user) { 

    if(this.isNotDuplicate(user.email) { 
     //continue doing whatever needs done to the data afterwards 
    } else { 
     response['error'] = True 
     response['response'] = "duplicate email" 
    } 

} 

Один из методов, который я пытаюсь найти, соответствует адресу, который соответствует и возвращает true или false.

this.isNotDuplicate = function(email) { 

    query = user.findOne({ 'email': email }); 
    query.exec(function(error, user) { 

     if(error) { 
      console.log(error); 
     } 

     console.log(user); 
     return (user === null) ? false : true; 

    }); 
} 

Если я прохожу по электронной почте в базе данных, там я могу видеть пользователь, когда я использую console.log(), но это не позволяет мне ничего возвращать, если это не локомотивы возвращают объект ответа. Но мне нужно иметь возможность продолжать обработку данных. Я понимаю, что могу сделать это просто совершенно неправильно, поэтому, если мой дизайн плох, мне нужно объяснение того, как изменить его для работы с node.js, express и locomotive.

Я прочитал документацию mongoose по запросам (http://mongoosejs.com/docs/queries.html). В своих примерах они используют console.log(), но, конечно, есть способ использовать данные, которые вы извлекаете из мангуста в другом месте, а не только в запрос мангуста. Если мой дизайн плохо идет по этому маршруту, как было бы предложено его изменить? Или как я могу просто вернуть либо данные из запроса мангуста, либо другое значение для использования?

ответ

4

Вам необходимо будет сделать this.isNotDuplicate асинхронным. Попробуйте что-то вроде этого:

this.isNotDuplicate = function(email, callback) { 
    var query = user.findOne({ 'email': email }) 
    query.exec(function(err, user) { 
    if (err) { 
     console.log(err) 
     callback(err) 
    } else { 
     console.log(user) 
     cb(null, !!user) 
    }) 
} 

А потом при проверке пользователя:

this.signUpUser = function(user) { 
    this.isNotDuplicate(user.email, function(err, exists) { 
    if (err || exists) { 
     response['error'] = true 
     response['message'] = (exists) ? 'duplicate email' : 'error' 
    } else { 
     // continue doing whatever needs to be done 
    } 
    }) 
} 
+0

Это работает благодаря за помощь. Я действительно новичок в приложениях nodejs, поэтому очевидно, что мне нужно больше разбираться в асинхронных методах и приложениях. – lumberjacked

Смежные вопросы