如何从Mongoose查询返回值

我正在做一个注册部分,在input数据到mongo之前进行一些服务器端validation。 我对mongoose是很新的,并且在返回数据到完成所有注册过程的方法时遇到麻烦。

在我的机车控制器中,我有一个包装一切的方法来开始注册过程。

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

在我的auth对象中,signUp只是在创build一个新用户之前通过validation数据。 一个validation是,在数据库中已经没有重复的电子邮件了。

 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()时,我可以看到用户,但是这不允许我返回任何东西,除非它是机车返回响应对象。 但是我需要能够继续对数据进行处理。 我意识到我可能会做这个完全错误的,所以如果我的devise不好,我需要解释如何改变它与node.js,express和locomotive配合使用。

我已阅读mongoose的查询文档( http://mongoosejs.com/docs/queries.html )。 在他们的例子中,他们使用console.log(),但当然有一种方法可以使用从其他地方的mongoose中获取的数据,而不仅仅是在mongoose查询中。 如果我的devise不好,这条路线会如何改变呢? 或者我怎么才能返回从mongoose查询或其他值使用的数据?

您将需要使this.isNotDuplicateasynchronous。 尝试这样的事情:

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