簡體   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