This is my code from routes file(users.js)
User.findOne({linkedin_id: req.body.linkedin_id}, function(err, linkedinUser) {
if(err) {
console.log('err in finding linkedin user '+err);
}
// if user exits
else if(linkedinUser) {
console.log('user exist');
const token = jwt.sign(linkedinUser, config.secret, {expiresIn: 604800});
res.json({success: true, token: 'JWT '+token, user: {
id: linkedinUser._id,
linkedin_id: linkedinUser.linkedin_id,
name: linkedinUser.name,
username: linkedinUser.username,
email: linkedinUser.email,
lkprofilePic: linkedinUser.profilePic
}, msg: 'user exits'
});
}
// if user doesn't exist
else {
User.create({
linkedin_id: req.body.linkedin_id,
name: req.body.name,
username: req.body.username,
email: req.body.email,
lkprofilePic: req.body.lkprofilePic
}, function(err, result) {
if(err) {
res.json({success: false, msg: 'failed to add'})
console.log('error in adding the data '+err);
}
else if(result) {
const token = jwt.sign(linkedinUser,config.secret,{ expiresIn: 604800 });
res.json({success: true, token: 'JWT '+token, user: {
id: result._id,
linkedin_id: result.linkedin_id,
name: result.name,
username: result.username,
email: result.email,
lkprofilePic: result.profilePic
}, msg: 'User added ' });
}
});
}
});
This from the config -> secret
module.exports = {
secret: 'bigfish'
}
This is the error I'm getting in the nodejs console
Receiving linkedin data D:\product\project-1\node_modules\mongodb\lib\utils.js:132 throw err; ^
Error: Expected "payload" to be a plain object. at validate (D:\product\project-1\node_modules\jsonwebtoken\sign.js:34:11) at validatePayload (D:\product\project-1\node_modules\jsonwebtoken\sign.js:56:10) at Object.module.exports [as sign] (D:\product\project-1\node_modules\jsonwebtoken\sign.js:108:7) at D:\product\project-1\routes\users.js:415:29 at Function. (D:\product\project-1\node_modules\mongoose\lib\model.js:4177:16) at parallel (D:\product\project-1\node_modules\mongoose\lib\model.js:2230:12) at D:\product\project-1\node_modules\mongoose\node_modules\async\internal\parallel.js:35:9 at D:\product\project-1\node_modules\mongoose\node_modules\async\internal\once.js:12:16 at iteratorCallback (D:\product\project-1\node_modules\mongoose\node_modules\async\eachOf.js:52:13) at D:\product\project-1\node_modules\mongoose\node_modules\async\internal\onlyOnce.js:12:16 at D:\product\project-1\node_modules\mongoose\node_modules\async\internal\parallel.js:32:13 at apply (D:\product\project-1\node_modules\lodash_apply.js:15:25) at D:\product\project-1\node_modules\lodash_overRest.js:32:12 at callbackWrapper (D:\product\project-1\node_modules\mongoose\lib\model.js:2199:11) at D:\product\project-1\node_modules\mongoose\lib\model.js:4177:16 at model.$__save.error (D:\product\project-1\node_modules\mongoose\lib\model.js:359:7)
But the data is getting saved in the database & doesn't return the
res.json({success: true, token: 'JWT '+token, user: {
id: result._id,
linkedin_id: result.linkedin_id,
name: result.name,
username: result.username,
email: result.email,
lkprofilePic: result.profilePic
}, msg: 'User added ' });
The issue is with the way you signed your token
The user you are using is a returned user from mongoose so you will need to use YOUR_USER.toJSON. if the user is not coming from mongoose use JSON.stringify(YOUR_USER) instead
change your code to either
const token = jwt.sign({linkedinUser}, config.secret, {expiresIn: 604800});
//if you want to set expiration on the token
OR
const token = jwt.sign(linkedinUser.toJSON(), config.secret);
//if you just want to sign the token without setting the expiration
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With