passport.js – 使用本地通行证从MongoDBvalidation用户

我在MongoDB中有一个简单的用户集合。 我用户mongo本地驱动程序。

{ "email": "johndow@example.com", "password": "123456", "_id": { "$oid": "50658c835b821298d3000001" } } 

当我通过对电子邮件进行用户身份validation:通过,我重新写了默认的通行证本地函数findByUsername这个:

 function findByEmail(email, fn) { db.collection("users", function(err, collection) { collection.find({}, {}, function(err, users) { users.each(function(err, user) { if (user.email === email) { return fn(null, user); } }); return fn(null, null); }); }); } 

只需要获取所有的用户表单数据库,并检查 – 如果user.email ==提供了电子邮件,则返回用户对象。

我使用MongoDB的_id参数作为用户的id,这就是为什么我修改了这两个函数:

 passport.serializeUser(function(user, done) { done(null, user._id); }); passport.deserializeUser(function(id, done) { findById(id, function(err, user) { done(err, user); }); }); 

这是我的护照本地策略的代码:

 passport.use(new LocalStrategy( function(email, password, done) { process.nextTick(function() { console.log('initialize findByEmail() for "',email,'"'); findByEmail(email, function(err, user) { if (err) { return done(err); } if (!user) { console.log('Unknown user ' + email) return done(null, false, { message: 'Unknown user ' + email }); } if (user.password != password) { console.log('Invalid password') return done(null, false, { message: 'Invalid password' }); } //сonsole.log('ALL VERIFIATION PASSED'); return done(null, user); }) }); })); 

我从login页面发布数据:

 app.post('/login', passport.authenticate('local', { failureRedirect: '/', failureFlash: true }), function(req, res) { res.redirect('/desk'); }); 

我得到了

 Error: Can't set headers after they are sent. 

之后,我得到了

 TypeError: Cannot read property 'email' of null 

最后一个错误是非常奇怪的,因为findByEmail有console.log(用户)行(从此列表中删除),并列出所有用户的数据。

我究竟做错了什么?

它没有很好的logging,但是cursor.each为其callback的第二个参数提供了一个null值,表示游标没有更多的可用文档。 这只是在文档的例子中提到的。

所以在你的情况下,你应该检查users.eachcallback。

但是,让mongo通过改变你的find呼叫来search你会更有效率:

 collection.findOne({email: email}, {}, function(err, user) { if (user) { // email was found case ... } ... }