我已经建立了用于创建JWT令牌的登录路由,但是在创建该令牌的函数之外,该令牌未定义,因此我无法在该函数之外使用它。
router.post('/login', (req, res) => {
const { errors, isValid } = validateLoginInput(req.body);
if (!isValid) {
return res.status(400).json(errors);
}
const email = req.body.email;
const password = req.body.password;
User.findOne({ email }).then(user => {
if (!user) {
return res.status(404).json({ emailnotfound: "Email not found"});
}
bcrypt.compare(password, user.password).then(isMatch => {
if (isMatch) {
const payload = {
id: user.id,
name: user.name
};
var token =jwt.sign(
payload,
keys.secretOrKey,
{ expiresIn: 31556926 },
(err, token) => {
res.json({
success: true,
token: "Bearer " + token
});
});
console.log(token)
} else {
return res.status(400).json({ passwordincorrect:
"Password incorrect"});
}
});
});
});
当代码点击该console.log语句时,它表明该令牌是未定义的,而不是返回该令牌。
答案 0 :(得分:0)
似乎您创建的令牌可能有问题。代码不检查令牌是否创建成功。
(err, token) => {
res.json({
success: true,
token: "Bearer " + token
})
}
将其更改为:
(err, token) => {
if (err){
console.log("Error while creating token:"+err.message);
console.error(err);
//send an error response as well if needed.
} else {
res.json({
success: true,
token: "Bearer " + token
})
}
这将帮助您找出问题所在。
答案 1 :(得分:0)
问题似乎在这里:
var token =jwt.sign(
payload,
keys.secretOrKey,
{ expiresIn: 31556926 },
(err, token) => {
res.json({
success: true,
token: "Bearer " + token
});
});
您可以检查正在使用的JWT库以查看它是否实际上接受回调吗?大多数JWT库上用于sign函数的正确语法是:
var token = jwt.sign(payload, secretKey, options);
console.log("Token :" + token);
选项通常包含以秒为单位定义的 expiresIn 。