繁体   English   中英

非空字符串被转换为“假”值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM