Fil*_*tic 2 node.js jwt passport.js
我在项目上工作,我发现奇怪的问题,jwt.sign函数不识别传递用户作为对象,但是当我在jwt.sign中创建新对象时,它工作正常.
如果从文本中难以理解的是代码:
var username = req.body.username;
var password = req.body.password;
User.getUserByUsername(username,(err, user)=>{
if(err)
throw err;
if(!user)
return res.json({success: false, msg: "User with username "+ username+" doesn't exist"});
User.comparePassword(password, user.password, (err, passwordsMatched) =>{
// Prints that user is type of object
console.log("Type of user: "+typeof(user));
if(err) throw err;
if(passwordsMatched){
// line bellow throws error that it expects object when I pass user
var token = jwt.sign(user, Config.secret, {expiresIn: 604800});
res.json({
success: true,
token: 'JWT '+token,
user: {
name : user.name,
username: user.username
}
});
}else{
return res.json({success: false, msg: "Password doesn't match"});
}
});
});
Run Code Online (Sandbox Code Playgroud)
行var token = jwt.sign(user, Config.secret, {expiresIn: 604800});抛出以下错误:
错误:验证时的预期对象...(jsonwebtoken和bcrypt模块的路径+我调用jwt.sign的行)
所以我试着修复,我发现如果我在函数调用中创建用户数据的新对象然后它工作,它看起来像这样:
var token = jwt.sign({_id : user._id,
username: user.username,
password: user.password
},
Config.secret,
{expiresIn: 604800});
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么函数不接受我的用户对象,如果有解决方案让它接受?
纵观代码的jsonwebtoken,还有就是lodash的通话isPlainObject功能:
检查value是否是普通对象,即Object构造函数创建的对象或[[Prototype]]为null的对象.
您的user对象必须通过此验证检查失败,这会导致您的错误.您尝试的修复似乎是合理的,但toObject如果您使用的是Mongoose,则可以使用.例如:
var token = jwt.sign(user.toObject(), Config.secret, {expiresIn: 604800});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1445 次 |
| 最近记录: |