Я сделал это в нескольких приложениях, и я не знаю, что здесь происходит, что не работает, когда я перехожу на свою страницу входа в систему и вхожу в систему, тогда у меня есть зарегистрированный пользователь, с которым может работать. Но в моем маршруте регистрации после регистрации пользователя я вызываю password.authenticate, но пользователь не проходит аутентификацию, и у меня нет пользователя, с которым можно работать, я не знаю, что не так. Я также написал маршрут сообщения регистра в формате обратного вызова без async / await без разницы. И пользователи добавляются в мою базу данных, поэтому они регистрируются.
Вот мой код:
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.info("The user is authenticated: " + req.isAuthenticated())
res.redirect('/');
}
catch(err) {
console.info(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.info("Current user is: " + req.user)
res.locals.currentUser = req.user;
next();
});
Спасибо





Ну, во-первых, вы здесь неправильно используете 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 из первоначального запроса). Затем, наконец, если наша аутентификация прошла успешно, паспорт вызовет следующее доступное промежуточное программное обеспечение, которое является нашим вызовом перенаправления.
@Jack, как объясняется в ответе, passport.authenticate специально разработан для работы в качестве промежуточного программного обеспечения, вы, конечно, можете использовать его напрямую, однако он написан таким образом, что его можно подключить к экспресс-маршруту (как показано в моем ответе).
есть ли причина, по которой вы создаете const registerUser вместо того, чтобы просто делать его функцией с именем registerUser?
@Jack в этом сценарии, кроме возможности использовать синтаксис стрелки, нет - async function registerUser(...) будет работать точно так же.
Спасибо! перебрал ваш ответ несколько раз стал понятнее!
Привет, Джеймс, большое спасибо за ответ. Я действительно застрял там. Я новичок в веб-разработке, узнал из онлайн-курса, они фактически научили методу Passport.authenticate ('local') (req, res, next), который я использовал, и на самом деле пробовал его здесь и не работал, обычно делает хотя может я что то не так сделал? Не могли бы вы сказать мне, почему вы сказали, что я не должен использовать этот метод ??? Кроме того, если вы могли бы, я не понимаю, почему то, что я делал, не работало, кажется, должно быть, не могли бы вы объяснить это мне, я действительно хочу научиться и стать лучше в этом. Огромное спасибо