在这个Passportjs.org页面上,文档给出了使用LocalStrategy的示例,在LocalStrategy中,它调用了一个函数:
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
现在,我看到这个“User
”对象出现在多个位置,例如passport-windowsauth策略的文档中,其中示例中使用了以下函数:
User.findOrCreate()
所以现在我想知道我是不是疯了。
这个'User'对象及其功能是一些现有的框架或功能集,还是这些只是你自己的本土功能的例子,用于寻找用户?
答案 0 :(得分:2)
User是一个包含用户信息的对象,findOne或findById或findByusername只是与此对象关联的原型函数。
他们已经为他们提供的所有示例假定了一个用户架构(Mongoose用户架构)。它带有随附的所有提到的原型功能
从他们的工作示例(没有Mongoose架构):
https://github.com/jaredhanson/passport-local/tree/master/examples/express3
在链接过期时添加代码:
var users = [
{ id: 1, username: 'bob', password: 'secret', email: 'bob@example.com' }
, { id: 2, username: 'joe', password: 'birthday', email: 'joe@example.com' }
];
function findById(id, fn) {
var idx = id - 1;
if (users[idx]) {
fn(null, users[idx]);
} else {
fn(new Error('User ' + id + ' does not exist'));
}
}
function findByUsername(username, fn) {
for (var i = 0, len = users.length; i < len; i++) {
var user = users[i];
if (user.username === username) {
return fn(null, user);
}
}
return fn(null, null);
}
passport.use(new LocalStrategy(
function(username, password, done) {
process.nextTick(function () {
findByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false, { message: 'Unknown user ' + username }); }
if (user.password != password) { return done(null, false, { message: 'Invalid password' }); }
return done(null, user);
})
});
}
));
参考:
https://github.com/jaredhanson/passport-local/tree/master/examples/express3