#node.js #validation #mongoose #passport.js
#node.js #проверка #mongoose #passport.js
Вопрос:
Я настраиваю passport для аутентификации пользователя при регистрации и входе в систему. Теперь я увидел, что могу проверить информацию с помощью обратного вызова, однако я также мог бы проверить информацию в пользовательской модели. Например, если я хочу сделать поле электронной почты обязательным, я могу сделать следующее:
Проверка с помощью Passport
// Create the local sign up with Passport
passport.use('local-signup', new LocalStrategy({
usernameField : 'userEmail', // Email Field
passwordField : 'userPassword', // Password Field
passReqToCallback : true
},
function(req, email, password, done) {
// Find a user with this email
User.findOne({ "local.email": email }, function(err, user) {
if (err) throw err;
// If a user with this email already exists, continue with failureRedirect
if (user) {
return done(null);
} else {
// Otherwise create a new user with the email and generate a hashed password
User.create({
local: {
email: email
}
}, function(err, user) {
if (err) throw err;
user.local.password = user.generateHash(password);
// Return the user and finish! :)
return done(null, user);
});
}
});
};
}));
С помощью пользовательской модели
var userSchema = new Schema({
local: {
email: {
type: String,
unique: true // Make it unique! Handles entire validation
},
password: {
type: String
},
}
});
Какой из них рекомендуется и почему?
Ответ №1:
Почему не оба? Если вы используете только второй, будет сложно отобразить сообщение
адрес электронной почты уже существует
поскольку вам нужно перехватить duplicate key error index
, а затем отобразить сообщение об ошибке при регистрации. Вместо этого вы могли бы проверить, существует ли адрес электронной почты, который является более явным, и одновременно отобразить соответствующее сообщение об ошибке при регистрации, используя уникальный индекс, чтобы убедиться, что для адреса электронной почты нет повторяющихся записей.
Комментарии:
1. Хороший момент. Знаете ли вы какие-либо рекомендации, когда дело доходит до проверок в express или аутентификации?
2. Я сам относительно новичок в ПОНИМАНИИ стека. Но до сих пор я использовал промежуточное программное обеспечение, предоставляемое defualt, например auth.requiresLogin. Для проверки одного запроса вы можете использовать req.IsAuthenticated(). Но я еще не создал свои пользовательские авторизации. Возможно, вы можете создавать уровни доступа и использовать их в качестве промежуточных программ для авторизации уровней данных. Я не уверен, что это стандартная практика. Может быть, кто-то с большим опытом даст нам больше информации
3. У меня есть немного опыта Rails, поэтому я привык к активным проверкам записей . Я не использую MEAN stack, но я написал функцию isLoggedIn для маршрутов, которая проверяет, аутентифицирован ли пользователь или нет. Меня больше беспокоят проверки, такие как минимальные символы, максимальные символы, регулярное выражение, уникальность, присутствие и т.д. . Запись их в файл обратного вызова passport, на мой взгляд, довольно запутанна, особенно, если пользователь хочет внести изменения в свою информацию. Проверки должны быть переписаны в контроллер, который не является сухим
4. Я предполагаю, что вы используете mongoose. Вы можете определить пользовательскую проверку для типов схем, которые сами выступают в качестве промежуточного программного обеспечения. Но имейте в виду тот факт, что промежуточное программное обеспечение (проверка) не вызывается при использовании
.update()
.5. Если вы считаете, что мой ответ решил вашу проблему, пожалуйста, не стесняйтесь пометить его как принятый ответ.