使用mongoose的承诺进行护照authentication

var LocalStrategy = require('passport-local').Strategy; var User = require('../models/user'); module.exports = function(passport){ passport.use('local-signup', new LocalStrategy({ usernameField: 'email', passwordField: 'password', passReqToCallback: true }, function(req, email, password, done){ User.findOne({'local.username': email}).exec() .then(function(user) { console.log(user); if(user){ return done(null, false, {message: 'Username already taken!'}); } else{ var newUser = new User(); newUser.local.username = email; newUser.local.password = password; return newUser.save(); } }) .then(function(user) { console.log('DEBUG DEBUG DEBUG'); done(null, user); }) .catch(function(err) { done(err); }); } )); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(userid, done) { User.findById(userid).exec() .then(function(user) { done(user); }); }); }; 

在我的情况下,debugging日志总是打印,是否返回newUser.save()被调用。 是否有可能使debugging日志只打印返回时newUser.save()被调用?

顺便说一句我正在使用passportJS进行身份validation的事情,并承诺我重写mongoose默认承诺与全球es6承诺。

你是这个意思吗? 对不起,如果有额外的括号或括号。 我在文本框中编辑。 🙁

  User.findOne({'local.username': email}).exec() .then(function(user) { if(user){ return done(null, false, {message: 'Username already taken!'}); } else{ var newUser = new User(); newUser.local.username = email; newUser.local.password = password; return newUser.save() .then(function(){ console.log('DEBUG DEBUG DEBUG'); done(null, user); }) } }) .catch(function(err) { done(err); }); } )); 

只要把你的debugging信息放在newUser.save()函数中

 User.findOne({'local.username': email}).exec() .then(function(user) { console.log(user); if(user){ return done(null, false, {message: 'Username already taken!'}); } else{ var newUser = new User(); newUser.local.username = email; newUser.local.password = password; return newUser.save(function() { console.log('SAVED!'); console.log('DEBUG DEBUG DEBUG'); }); } }) .then(function(user) { done(null, user); })