Вначале я упомяну, что я новичок в программировании, node, js и особенно в паспорте / аутентификации в целом. Я неустанно искал и нашел похожие проблемы в стеке, но не могу сформулировать решение на основе найденных мной ответов. Я прошу прощения за длинный вопрос, и если он нарушает какой-либо этикет ТАК.
Я знаю, что вводимые пользователем значения правильно передаются из формы ejs в мою функцию authController (я могу регистрировать каждое в консоли через req.body ...). Я также знаю, что моя база данных работает правильно, поскольку я обращался к ней в других областях. На основании своих исследований я подозреваю, что пароль может быть передан как объект и каким-то образом не сериализован должным образом. При этом в моем файле app.js я обязательно сделаю следующее, что, по моему мнению, должно избежать этой проблемы:
var User = require('./models/users');
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
Я получаю следующую ошибку:
ValidationError: User validation failed: user_password: Path `user_password` is required.
message: 'Path `user_password` is required.',
name: 'ValidatorError',
properties: [Object],
kind: 'required',
path: 'user_password',
value: undefined,
reason: undefined,
'$isValidatorError': true
/models/users.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');
var UserSchema = new Schema(
{
first_name: {type: String, required: true, max:100},
last_name: {type:String, required: true, max: 100},
email_address: {type: String, required:true, max: 100},
username: {type:String, required: true, max: 100},
user_password: {type: String, required:true, max: 100}
}
);
UserSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', UserSchema);
authController.js
userController.doRegister = function(req, res) {
console.info(req.body.user_password);
var newUser = new User({
first_name: req.body.first_name,
last_name: req.body.last_name,
email_address: req.body.email_address,
username: req.body.username
});
User.register(newUser, req.body.user_password, function(err, user) {
if (err) {
console.info(err);
return res.render('register', { user : user });
}
passport.authenticate('local')(req, res, function () {
res.redirect('/');
console.info('reached end of doregister in auth contro');
});
});
};
register.ejs
<table>
<tr><td>First Name</td><td><input type = "text" name = "first_name" ></td></tr>
<tr><td>Last Name</td><td><input type = "text" name = "last_name" ></td></tr>
<tr><td>Email Address</td><td><input type = "text" name = "email_address" ></td></tr>
<tr><td>Username</td><td><input type = "text" name = "username" ></td></tr>
<tr><td>Password</td><td><input type = "text" name = "user_password" ></td></tr>
<tr><td colspan = "3"><input type = "submit" value = "Register" ></td></tr>
</table>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Как я вижу, ваша ошибка, вероятно, связана с этим:
var newUser = new User({
first_name: req.body.first_name,
last_name: req.body.last_name,
email_address: req.body.email_address,
username: req.body.username
});
Здесь у вас должен быть user_password
var newUser = new User({
first_name: req.body.first_name,
last_name: req.body.last_name,
email_address: req.body.email_address,
username: req.body.username,
user_password: req.body.user_password
});
Поскольку это необходимо, вы не можете создать нового пользователя без него. Лучшим подходом является обработка пароля в перед сохранением, там вы хешируете и проверяете его.
Он опубликовал ошибку Mongoose ValidationError: ValidationError: Ошибка проверки пользователя: user_password: Требуется путь user_password.
Согласовано. Но это неправильный способ решения проблемы. Если OP принимает ваш ответ, проблема все еще существует, он не собирается входить в систему пользователя. Очевидно, OP не до конца понимает, как работает заграничный пасспорт, в схеме не должно быть поля пароля вообще, вместо этого оно должно быть добавлено паспорт-местный-мангуст.
Прежде всего, вы не хотите обрабатывать пароль пользователя в своей схеме (т.е. удалить user_password из своей пользовательской схемы). Это небезопасно, так как вы не хешировали и не добавляли свой пароль пользователя, это также причина, по которой вы хотите использовать библиотеку заграничный пасспорт. Поскольку, очевидно, вы не хотите касаться хеширования и соления паролей, просто позвольте паспорт-местный-мангуст сделать это за вас.
Далее, настоящая проблема в промежуточном программном обеспечении вашего контроллера заключается в том, что вы не передали объект мангуста user в req.login. passport.authenticate('local', (err, authUser) => { (do_something) }) - это промежуточное программное обеспечение, которое дает вам объект аутентифицированного пользователя после обратного вызова, но не заполняет объект req.user, пока вы не решите «войти» пользователя. Поэтому вам следует попробовать следующее:
userController.doRegister = function(req, res) {
console.info(req.body.user_password);
const newUser = new User({
first_name: req.body.first_name,
last_name: req.body.last_name,
email_address: req.body.email_address,
username: req.body.username
});
User.register(newUser, req.body.user_password, function(err, user) {
if (err) {
console.info(err);
return res.render('register', { user : user });
}
req.login(user, err => {
if (err) throw err;
console.info('reached end of doregister in auth contro');
return res.redirect('/');
});
});
};
Примечание: пожалуйста, не используйте var, так как теперь у нас есть const.
Большое спасибо за ваш ответ - он очень полезен. Одно изменение, которое я внес перед его компиляцией, как ожидалось, заключалось в замене res.logIn на req.login. Теперь он работает, еще раз спасибо!
Да или нет, настоящая проблема входа не здесь. Но вы были абсолютно правы, должна быть ошибка валидации, так как
user_passwordявляется обязательным полем.