После сохранения нового объекта User в базе данных вы можете получить идентификатор из возвращенного результата. Я не знаю mon go слишком хорошо, поэтому вам придется посмотреть на результат, полученный из .save()
, и получить идентификатор оттуда. Вот общая структура:
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);
});
});