在Mongodb中创建后如何修改Express路由以登录用户?

我的灵魂

我有下面的路线。如果我在 MongoDB 中手动添加文档,它会起作用。但是,我想处理找不到用户、创建用户然后自动登录的情况。

修改这条路线的最佳方法是什么?

router.post("/loginViaFacebook", (req, res) => {
  const userEmail = req.body.email;
  const errors = {};

  User.findOne({ email: userEmail }).then(user => {
    if (!user) {
      new User({
        facebookId: req.body.facebookId,
        name: req.body.name,
        email: req.body.email,
        pictureUrl: req.body.picture
      }).save();
    } else {
      const payload = {
        facebookId: user.id,
        name: user.name,
        email: user.email,
        pictureUrl: user.picture
      };

      jwt.sign(payload, secretOrKey, { expiresIn: 3600 }, (err, token) => {
        res.json({ success: true, token: "Bearer " + token });
      });

      console.log("success!");
    }
  });
});
jfriend00

将新的 User 对象保存到数据库后,可以从返回的结果中获取 id。我不太了解 mongo,因此您必须查看返回的结果.save()从中获取 id。这是一般结构:

const promisify = require('util').promisify;
const jwt.signPromise = promisify(jwt.sign);

/**
 * @route POST api/auth/loginViaFacebook
 * @desc Login User via Facebook/
 * @access public
 */
router.post("/loginViaFacebook", async (req, res) => {
    const userEmail = req.body.email;
    const errors = {};

    try {
        let user = await User.findOne({
            email: userEmail
        });
        if (!user) {
            user = new User({
                facebookId: req.body.facebookId,
                name: req.body.name,
                email: req.body.email,
                pictureUrl: req.body.picture
            });
            user = await user.save();
        }
        const payload = {
            facebookId: user.facebookId,
            name: user.name,
            email: user.email,
            pictureUrl: user.picture
        };

        let token = await jwt.signPromise(payload, secretOrKey, {expiresIn: 3600});
        res.json({success: true, token: "Bearer " + token});

    } catch (e) {
        // send some sort of error response here
        console.log(e);
        res.sendStatus(500);
    }
});

如果您想在不使用 的情况下坚持使用原始结构await,则只需将重复的代码移动到公共函数中即可。

/**
 * @route POST api/auth/loginViaFacebook
 * @desc Login User via Facebook/
 * @access public
 */
router.post("/loginViaFacebook", (req, res) => {
  const userEmail = req.body.email;
  const facebookId = req.body.facebookId;

  function finish(user) {
    const payload = {
      facebookId: user.facebookId,
      name: user.name,
      email: user.email,
      pictureUrl: user.picture
    };

    jwt.sign(payload, secretOrKey, { expiresIn: 3600 }, (err, token) => {
      if (err) {
          console.log(err);
          res.sendStatus(500);
          return;
      }
      res.json({ success: true, token: "Bearer " + token });
    });
    return;
  }

  // Find user by email. ( Down below { email } in ES6 is same as { email: email }
  User.findOne({ email: userEmail }).then(user => {
    if (!user) {
      new User({
        facebookId: facebookId,
        name: req.body.name,
        email: userEmail,
        pictureUrl: req.body.picture
      }).save(function(err, user) {
        if (err) {
            res.send({ errors: err });
            return;
        }
        finish(user);        
      });
    } else {
      finish(user);
    }
  }).catch(err => {
      console.log(err);
      res.sendStatus(500);
  });
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

创建帐户后登录用户

登录用户在Firebase中通过Facebook登录iOS Swift后如何检查?

如何在Spring Security 4中动态修改登录用户的角色?

播种用户时如何创建默认的登录用户帐户?

登录用户而无需在rspec中创建多个用户

挂载/复制后如何在/ home /文件夹中登录用户?

CakePHP 3:如何在注册后自动登录用户

如何为数据库中的登录用户创建配置文件?

如何在django-graphql-jwt中结合使用突变来创建或登录用户?

如何在Skyve中向所有登录用户创建广播消息?

用户登录后如何修改导航栏?

如何获取实际登录用户创建的“测试”对象?

如何使用 PHP 创建多登录用户?

Django中如何查看登录用户以外的用户信息?

我试图在 django 中获取登录用户的对象?这个列表是在登录用户的 form.save 时创建的

如何根据登录用户和来宾用户对Laravel路由进行分组

如何找到阻止重启的“在Windows中登录用户”?

如何确定Windows XP中的登录用户?

Powershell - 如何检查特定机器中的登录用户

如何在Windows中获取登录用户的SID

如何在WooCommerce中登录用户会员计划

在php中登录用户时如何显示个人报告

如何在wordpress中基于登录用户添加条件?

如何在rails中显示与登录用户相关的数据

如何在Spring Security中从Java代码登录用户?

如何获取服务中的当前登录用户

在Meteor中,如何仅为登录用户加载某些文件?

如何在yii中显示已登录用户的属性

如何防止在会员列表中显示登录用户?