繁体   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