我已经在expresJS中进行了设置,用户可以在其中填写表格,然后转到执行以下步骤的注册路线:
该路线的代码:
router.post('/register',
userController.validateRegister,
userController.register,
authController.login
);
问题是,我不想直接注册用户。 我想向他们发送电子邮件,然后在单击链接时实际上对其进行注册。
我猜想这样做的方法是不使用我的注册路线(注册)中的步骤2,而是向用户发送一封电子邮件,其中包含完成注册的链接,然后在用户单击我注册的链接时,登录。
因此,我认为如果删除register方法,我可以跳到login方法,从而解决了用户无需注册即可登录的问题(无需注册) 保存到数据库)
但是当我提交表单时,出现错误:
Failed Login!
哪个来自登录方法:
exports.login = passport.authenticate('local', {
failureRedirect: '/login',
failureFlash: 'Failed Login!',
successRedirect: '/',
successFlash: 'You are now logged in!'
});
因此,我对如何将当前设置(即当场注册它们)更改为他们必须单击要发送给他们的电子邮件的方式有点迷茫。
这是im在注册路由中使用的方法:
exports.validateRegister = (req, res, next) => {
req.sanitizeBody('name');
req.checkBody('name', 'You must supply a name!').notEmpty();
req.checkBody('email', 'That Email is not valid!').isEmail();
req.sanitizeBody('email').normalizeEmail({
gmail_remove_dots: false,
remove_extension: false,
gmail_remove_subaddress: false
});
req.checkBody('password', 'Password Cannot be Blank!').notEmpty();
req.checkBody('password-confirm', 'Confirmed Password cannot be blank!').notEmpty();
req.checkBody('password-confirm', 'Oops! Your passwords do not match').equals(req.body.password);
const errors = req.validationErrors();
if (errors) {
req.flash('error', errors.map(err => err.msg));
res.render('register', { title: 'Register', body: req.body, flashes: req.flash() });
return; // stop the fn from running
}
next(); // there were no errors!
};
exports.register = async (req, res, next) => {
const user = new User({
email: req.body.email,
name: req.body.name,
location: {
address: req.body.location.address,
vicinity: req.body.location.vicinity,
coordinates: [
req.body.location.coordinates[0],
req.body.location.coordinates[1],
]
}
});
const register = promisify(User.register, User);
await register(user, req.body.password);
next(); // pass to authController.login
};
exports.login = passport.authenticate('local', {
failureRedirect: '/login',
failureFlash: 'Failed Login!',
successRedirect: '/',
successFlash: 'You are now logged in!'
});
护照的配置如下:
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
答案 0 :(得分:1)
为什么在用户未注册时登录?
默认情况下,您可以在用户模型设置中将布尔属性(如isVerified
添加到false
。
仅将isVerified
属性设置为true
的用户允许登录过程。
当用户单击注册电子邮件中包含的链接时,则可以将isVerified
设置为true
,并且用户可以自由登录。
这样,您可以在注册过程中运行register方法。
用户提交注册表时,没有理由立即登录。
您可以呈现一个信息页面,通知用户account verification
电子邮件已发送到他的电子邮件帐户。