[英]Non-empty string being converted to "falsy" value?
我是学习 React/Express 的初学者,但遇到了问题。 我弄清楚了问题的原因,但我仍然感到困惑。 基本上,当用户登录应用程序时,我使用 JsonWebToken 创建一个访问令牌并将其存储在 session 存储中。 然后,我使用 axios 发出一个发布请求,传递数据并在标头中传递访问令牌。 我在以下 function 中执行此操作:
const addComment = () => {
if (newComment){
axios
.post(`http://localhost:3001/comments/${id}`, {comment: newComment}, {headers: {accessToken: sessionStorage.getItem("accessToken")}})
.then(response => {
setComments(response.data);
}).catch(error => {
console.log(error);
});
setNewComment("");
}
}
然后在后端处理请求,首先通过中间件:
const { verify } = require("jsonwebtoken");
const validateToken = (req, res, next) => {
const accessToken = req.header("accessToken");
console.log(req.header("accessToken")); // correctly returns token
console.log(typeof accessToken); // returns 'string'
console.log(accessToken === true); // returns 'false'
if (!accessToken) {
return res.json({error: "User not logged in"});
}
try{
const validToken = verify(accessToken, "importantSecret");
if (validToken){
return next();
}
} catch(err){
return res.json({error: err});
}
}
module.exports = { validateToken };
为了调试,我使用了console.log()
语句。 当我将accessToken
的值记录到控制台时,我(如预期的那样)得到以下信息:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im9saXZlciIsImlkIjoiNjMwYWUzYjRkMmRiZmUyZGE5NDZiNmRkIiwiaWF0IjoxNjYxNzA5ODAxfQ.oVm1bIY6J5lxnaubeUh-fWWnIObmiUuL1LXjRbrW_mQ
问题是即使accessToken
是一个非空字符串,表达式accessToken === true
仍然评估为false
并且!accessToken
仍然评估为true
,导致 function 返回错误。 我现在知道如何解决这个问题,但我真的很想知道为什么会这样。 答案将不胜感激!
令牌不等于 true 它等于令牌值。 你想要的是检查是否有一个令牌,所以你会做if(token)
而不是if(token === true)
。
所以console.log('hi' === true)
将记录 false 因为字符串'hi'
不等于 true 它等于'hi'
在此处检查 javascript 相等性和相同性如何工作:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.