簡體   English   中英

VS Code - TypeError:無法讀取未定義的屬性“toUpperCase”

[英]VS Code - TypeError: Cannot read property 'toUpperCase' of undefined

當我在 VSCode 上使用 js 修改 if 語句時出現 TypeError。

在我添加 .toUpperCase() 方法之前,以下 if 語句有效:

`ourApp.post('/answer', function(req, res) {
    if (req.body.skyColor.toUpperCase() == "BLUE") {
        res.send(
        <p>Congrats, that is the correct answer!</p>
        <a href="/">Back to homepage</a>
        )`

**請注意,我確實在需要的地方有模板文字,但它們與上述格式混淆,所以我不得不刪除它們。

但是在我添加了上面的 .toUpperCase() 方法之后,我得到了以下 TypeError:

TypeError:無法在 Layer.handle [as handle_request] (/home/ryan/JavaScript/node_modules/express/lib/router/layer) 處讀取 /home/ryan/JavaScript/test.js:16:27 處未定義的屬性“toUpperCase” .js:95:5) 在下一個 (/home/ryan/JavaScript/node_modules/express/lib/router/route.js:137:13) 在 Route.dispatch (/home/ryan/JavaScript/node_modules/express/lib /router/route.js:112:3) 在 Layer.handle [as handle_request] (/home/ryan/JavaScript/node_modules/express/lib/router/layer.js:95:5) 在 /home/ryan/JavaScript /node_modules/express/lib/router/index.js:281:22 在 Function.process_params (/home/ryan/JavaScript/node_modules/express/lib/router/index.js:335:12) 在下一個 (/home/ ryan/JavaScript/node_modules/express/lib/router/index.js:275:10) 在 /home/ryan/JavaScript/node_modules/body-parser/lib/read.js:130:5 在 invokeCallback (/home/ryan /JavaScript/node_modules/raw-body/index.js:224:16)

我在想我的 express 安裝有問題嗎? 不過,我有 package.json 文件和所有安裝在工作文件夾中的文件,所以我不確定哪里可能有損壞的文件或任何東西。

有任何想法嗎?

Express 默認不解析正文。 它僅作為 Stream 提供。

我為您看到的最佳解決方案是在端點之前使用json()中間件。

嘗試添加:

// parse application/json
app.use(express.json())

// Your endpoint here

app.use() function 意味着你收到的每個請求都會通過指定的方法 go ,在這種情況下,它將請求的正文解析為req.body字段。

這假定將使用正確的 Header ( Content-Type: "application/json" ) 調用您的端點,並且您實際上發送的是格式正確的Json正文。

檢查正文的內容是否具有您期望的內容是一個好主意,此斷言將防止您的代碼出現許多錯誤和崩潰。

為此,在 Npm 上有許多用於模式驗證的庫,只需選擇最適合您的庫即可。

從您的評論來看,您的傳入請求似乎來自<form>

而且,在其默認配置中,Express 不會自動為您讀取和解析任何 POST 或 PUT 請求的正文。 相反,您需要安裝正確的中間件來為您讀取和解析正文。 在您的情況下,來自瀏覽器的傳入<form>通常是application/x-www-form-urlencoded MIME 類型。 要解析它,您將添加以下行:

app.use(express.urlencoded({extended:true}))

在您的app.post()處理程序之前的某個時間點。 您可以在此處查看相關的快速文檔。 該中間件將檢查主體的 mime 類型,如果它是表單通常設置的上述類型,那么它將讀取傳入請求的主體並對其進行解析並將結果放入req.body以便您的請求處理程序可以訪問req.body中的數據。

如果在安裝此中間件后,它仍然無法正常工作,那么我們需要更多地了解傳入的 http 請求中的確切內容,以便我們可以准確查看正文中的內容。 假設這是來自瀏覽器,您可以 go 進入 Chrome 調試器(在頁面中右鍵單擊並單擊“檢查”,然后 go 在任何瀏覽器操作導致其將數據發送到服務器之前到網絡選項卡。然后,通過查看網絡選項卡中屏幕左側的列表,您可以找到對您服務器的特定請求,單擊它,然后右側窗格將顯示請求的詳細信息。

它現在有效,我相信我知道為什么:

我退出 VS Code 並重新啟動它大約 3-4 次。 上次,我在我的目錄中查找了工作文件夾並將其打開(右鍵單擊“使用代碼打開”)。 現在一切正常。

我確定我已經在 VSC 中的那個文件夾中工作了,所以我對究竟發生了什么變化感到有點困惑,但它可以工作......所以¯_(ツ)_/¯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM