Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过电子邮件向expressJS确认注册_Javascript_Express_Passport.js - Fatal编程技术网

Javascript 通过电子邮件向expressJS确认注册

Javascript 通过电子邮件向expressJS确认注册,javascript,express,passport.js,Javascript,Express,Passport.js,我已经在expresJS中设置了一个用户填写表单,然后它进入一个注册路径,该路径经过以下步骤: 验证数据(清理电子邮件和用户名) 注册(如果数据有效,则将用户保存到数据库) 登录(使用passportJS) 该路线的代码: router.post('/register', userController.validateRegister, userController.register, authController.login ); 问题是,我不想直接注册用户。 我想给他们发送一封

我已经在expresJS中设置了一个用户填写表单,然后它进入一个注册路径,该路径经过以下步骤:

  • 验证数据(清理电子邮件和用户名)
  • 注册(如果数据有效,则将用户保存到数据库)
  • 登录(使用passportJS)
  • 该路线的代码:

    router.post('/register',
      userController.validateRegister,
      userController.register,
      authController.login
    );
    
    问题是,我不想直接注册用户。 我想给他们发送一封电子邮件,然后当点击链接时,它实际上会注册他们

    我猜这样做的方法是不在我的注册路径(注册)中使用步骤2,而是向用户发送一封包含链接的电子邮件以完成注册,然后当用户单击链接时,我注册并登录他们

    所以我想,如果我删除register方法,我可以跳到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的配置如下:

    passport.use(User.createStrategy());
    
    passport.serializeUser(User.serializeUser());
    passport.deserializeUser(User.deserializeUser());
    

    用户未注册时为什么要登录?

    默认情况下,您可以将用户模型设置中的布尔属性(如
    isVerified
    )添加到
    false

    仅允许
    isVerified
    属性设置为
    true
    的用户进行登录过程

    当用户单击注册电子邮件中包含的链接时,您可以将
    isVerified
    设置为
    true
    ,用户可以自由登录。
    这样,您就可以在注册期间运行register方法

    当用户提交注册表时,没有理由立即登录。

    您可以呈现一个信息页面,通知用户一封
    帐户验证
    电子邮件已发送到他的电子邮件帐户。

    是的。。。我改变了原来的问题,因此不需要立即记录用户。我觉得你的解决方案很好!对我来说也更容易,那么我该怎么做呢?我注册用户,然后发送一封电子邮件,其中包含一个带有令牌的链接和电子邮件?然后当用户点击链接时,它会把他带到一条将标志改为正数的路线?你是这样想的吗?非常感谢!是的,您可以添加一个用户属性
    verifyToken
    ,在注册过程中可以为每个用户分配一个随机生成的值。通过电子邮件发送给用户的链接应包含该令牌。然后,当用户单击链接时,您可以验证令牌并验证用户。