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.each
callback。
但是,让mongo通过改变你的find
呼叫来search你会更有效率:
collection.findOne({email: email}, {}, function(err, user) { if (user) { // email was found case ... } ... }