我有下面的路线。如果我在 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!");
}
});
});
将新的 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] 删除。
我来说两句