我遍布文档,但我似乎无法找到更新凭据的方法。
这是我能够通过分析代码来获取的。
passport.deserializeUser(function(id, done) {
AppUser.findById(id, function(err, user) {
done(err, user);
});
});
DeserializeUser似乎很有用,但我不知道如何使用它来更新或添加字段?
我试图破解并从登录中复制逻辑并理解它。
passport.use('local-update', new LocalStrategy({
usernameField : 'username',
passReqToCallback : true
},
function(req, username, done) {
console.log(req)
// asynchronous
// AppUser.findOne wont fire unless data is sent back
// process.nextTick(function() {
// // find a user whose email is the same as the forms email
// // we are checking to see if the user trying to login already exists
// AppUser.findOne({ 'local.email' : email }, function(err, user) {
// // if there are any errors, return the error
// if (err)
// return done(err);
// // check to see if theres already a user with that email
// if (!user) {
// //return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
// return done(null, false);
// } else {
// // if there is a user with that email
// // create the username
// var updateUser = new AppUser();
// // set the user's local credentials
// newUser.local.email = email;
// newUser.local.password = newUser.generateHash(password);
// // save the user
// newUser.update(function(err) {
// if (err)
// throw err;
// return done(null, newUser);
// });
// }
// });
// });
}));
然后在表格提交上我做了这个。
app.post('/profile', passport.authenticate('local-update', {
successRedirect : '/', // redirect to the secure profile section
failureRedirect : '/signup' // redirect back to the signup page if there is an error
//failureFlash : true // allow flash messages
}));
这会导致重定向失败。
它不起作用,因为没有响应,但我需要在mongoDB中找到模型。我试图首先在控制台中看到req,这样我可以看到如何找到模型,但没有任何东西出现。
上面显然是HACKISH代码,但这是我能做的最好的。我需要一个具体的答案,我确信它很简单,我在文档中遗漏了它!
编辑:这里的想法是当用户注册/登录他们提供电子邮件时。用户登录并创建帐户后,即可创建用户名。
编辑:所以我无法弄清楚如何使用护照进行更新请求,但在我的路由器中我有类似的内容。
app.post('/', function(req, res) {
if (req.user) {
AppUser.findOne({ _id: req.user.id }, function (err, user) {
user.local.username = req.body.username;
user.save(function(err) {
if (err){
console.log('Error')
} else {
console.log('Sucess')
}
});
});
}
});
唯一的问题是浏览器默认操作,它提交表单并使页面保持无休止的重新加载。但它确实更新了我的mongodb模型。我不得不添加到Schema中,并且必须在我的护照注册逻辑中添加该属性。
但我可以将这个逻辑添加到我的客户端代码中,并将POST方法抛出到主干中,这应该可行!
答案 0 :(得分:1)
在这种情况下,您可以添加callback array
作为Express路线的参数。
我猜您可以将验证处理程序更改为:
function(req, username, done) {
//perform here only the validations you need to let the login pass
if (validationSuccess) {
done();
} else {
done('an error occured');
}
}
因此,假设此函数将成功验证用户凭据,您可以编写另一个:
function doSomethingAfter(req, res, next) {
//do anything else you need here
//e.g.
SomeModel.create(req.body.username);
//the response is available here
res.send('Everything ok');
}
最后,您可以编辑路由功能
app.post('/profile', [passport.authenticate('local-update', {
failureRedirect : '/signup' // redirect back to the signup page if there is an error
}), doSomethingAfter]);
这样,您可以在正确验证请求后执行身份验证并制作任何您想要的内容。如果您需要添加更多功能,则必须将它们添加到阵列中并在每个功能上调用next()
。
希望它有所帮助。