簡體   English   中英

在 url 路徑中傳遞多個路由參數時出錯

[英]Error passing multiple route parameters in a url path

我正在嘗試根據 3 個字段(“nkk”、“nik”和“nama”)的值獲取數據。

選民-ctrl:

getVotersByParams = async (req, res) => {
        const nkk = req.params.nkk
        const nik = req.params.nik
        const nama = req.params.nama

    await Voter.find({nkk, nik, nama}, (err, voters) => {
        if (err) {
            return res.status(400).json({ success: false, error: err })
        }
        if (!voters.length) {
            return res
                .status(404)
                .json({ success: false, request: req.params, error: `Voter not found` })
        }
        return res.status(200).json({ success: true, data: voters })
    }
}

有可能其中一兩個是空的或用戶未定義。 當參數之一為空(或未定義)時,問題是在 url 路由中傳遞多個參數返回“未找到”結果:

選民路由器:

const express = require('express')

const VotersCtrl = require('../controllers/voters-ctrl')

const router = express.Router()

router.get('/votersbyparams/:nkk/:nik/:nama', VotersCtrl.getVotersByParams)

module.exports = router

查詢成功結果: 在此處輸入圖像描述

“nkk”參數為空時的“未找到”查詢結果: 在此處輸入圖像描述

我怎么解決這個問題? 非常感謝您提前。

在您的情況下,當其中一個值可能undefined或為空時,您應該在查詢字符串中傳遞所有這些值,而不是在部分路由中傳遞。 查詢字符串使您可以只傳遞一些值。

閱讀req.query文檔以了解如何從查詢字符串中讀取這些值。

要按原樣使用 URL 參數(即使用req.params ),您需要在 URL 中指定它們,如下所示:

// Browser
fetch(`${apiRoot}/votersby?nkk=${arg1}&nik=${arg3}&nama=${arg3}`)

// Server
router.get(`/votersby`, (req, res) => {
   const { nkk, nik, nama } = req.params
   console.log({ nkk, nik, nama })
   // ...
})

實際上,您應該使用具有不同查詢參數的相同端點。

您當前指定它們的方式實際上通常是:

A)ID(如果有一個/:id B)看起來更像是動態路徑(路由)構建,如果在 API 中找不到某些動態生成的路由,您將獲得 404。

有關指定參數字符串的更多信息,請參見下文:

https://javascript.info/url

我通過使用查詢字符串而不是多個路由參數找到了答案。

Function 處理搜索按鈕:

const handleFindClick = async () => {
     const payload = { nkk, nik, nama }
     setIsLoading(true)
     const voters = await api.getVotersByParams(payload)
     setVoters(voters.data.data)
     setIsLoading(false)
     console.log(voters)
    }

有效載荷數據正在發送到此 api 路由:

export const getVotersByParams = (payload) => api.get(`/votersbyparams nkk=${payload.nkk}&nik=${payload.nik}&nama=${payload.nama}`)

最后,在服務器中執行的getVotersByParams function:

getVotersByParams = async (req, res) => {
    const {nkk, nik, nama} = req.query
    await Voter.find({nkk : nkk.length > 0 ? nkk : {$exists : true}, nik : nik.length > 0 ? nik : {$exists : true}, nama : nama.length > 0 ? nama : {$exists : true}}, (err, voters) => {
        if (err) {
            return res.status(400).json({ success: false, error: err })
        }
        if (!voters.length) {
            return res
                .status(404)
                .json({ success: false, error: `Voter not found` })
        }
        return res.status(200).json({ success: true, data: voters })
    })

暫無
暫無

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

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