我已经在一些应用程序中完成了此操作,但我不知道这里发生了什么不起作用,当我进入登录页面并登录用户时,我就有一个可以使用的登录用户。但是在我注册用户后,在我的注册路径中,我将其称为passport.authenticate,但该用户仍未获得身份验证,并且我没有用户可以使用,因此我不知道出了什么问题。我还以回调格式编写了注册后路由,而没有异步/等待没有区别。并且用户被添加到我的数据库中,因此他们已经注册。
这是我的代码:
router.get('/register', function(req, res) {
res.render('register')
});
router.post('/register', async (req, res) => {
try{
var newUser = new User({username: req.body.username});
await User.register(newUser, req.body.password);
await passport.authenticate('local');
console.log("The user is authenticated: " + req.isAuthenticated())
res.redirect('/');
}
catch(err) {
console.log(err);
res.redirect('/');
}
});
console.log返回false。
用户模型:
var mongoose = require('mongoose'),
passportLocalMongoose = require('passport-local-mongoose');
var UserSchema = new mongoose.Schema({
username: String,
password: String
});
UserSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', UserSchema);
注册页面:
<% include ./partials/header %>
<h1>Please Sign-Up</h1>
<form action='register' method='POST'>
<label>Username</label>
<input type='text' name='username'>
<label>Password</label>
<input type='password' name='password'>
<button type='submit'>Submit</button>
</form>
<% include ./partials/footer %>
在我的app.js文件中:
app.use(function(req,res,next) {
console.log("Current user is: " + req.user)
res.locals.currentUser = req.user;
next();
});
谢谢
答案 0 :(得分:1)
首先,您在这里误用了passport.authenticate
-对于您通过的策略类型,此函数将返回正确的连接/与表达式兼容的中间件,在您的情况下为local
。因此,实际上,如果您确实确实想像这样使用它,则需要像passport.authenticate('local')(req, res, next)
这样称呼它。...但是,我不认为您真的想这样做。
您在这里有三个单独的操作
对我来说,应该作为三种独立的中间件发生
const registerUser = async (req, res, next) => {
try {
const { username, password } = req.body;
const user = new User({ username });
await User.register(user, password);
return next();
} catch (e) {
return next(e);
}
}
router.post('/register',
registerUser, // register user in the DB
passport.authenticate('local'), // authenticate user credentials
(req, res) => res.redirect('/') // redirect user
)
因此,为了弄清楚这里发生的事情,当点击/register
路由时,它将首先尝试通过registerUser
中间件注册用户。假设一切顺利,我们调用next
来调用下一个中间件,这就是我们的护照本地策略(凭据仍将保留在初始请求的req.body
中)。最后,如果我们的身份验证成功,passport将调用下一个可用的中间件,即我们的重定向调用。