检查 Express Mongoose 中是否 req.param.dogid / req.param.dogname

Check if req.param.dogid / req.param.dogname in Express Mongoose

我在同一个文件中有 2 个 GET 函数。

一个用于 dogid,另一个用于 dogname。

//Operations for api/dogs/{dogId} route
//get operation
 router.get('/:dogId', async (req,res)=>{   
      try{
          const dog = await Dogs.findById(req.params.dogId);
          res.json(dog);
      }catch(error){
          res.json({message:error});
      }
  
  })

//Operations for api/dogs/{dogName} route
 //get operation
 router.get('/:dogName', async (req,res)=>{   
      try{
          const dog = await Dogs.find({'name': { $in: req.params.dogName}})
          res.json(dog);
      }catch(error){
          res.json({message:error});
      }
  
  })

当我尝试 npm start 时,它没有出现任何问题。

但是在 Postman 中,当我为 http://localhost:3000/api/dogs/Sasha

发送 GET 操作时

然后显示如下:

{
    "message": {
        "stringValue": "\"Sasha\"",
        "valueType": "string",
        "kind": "ObjectId",
        "value": "Sasha",
        "path": "_id",
        "reason": {},
        "name": "CastError",
        "message": "Cast to ObjectId failed for value \"Sasha\" (type string) at path \"_id\" for model \"Doggies\""
    }
}

获取狗名数据的代码已经存在。但是由于 dogid 路由的 get 函数是在 dogname 路由之前编写的,所以它显示了这个错误。

问题是 GET api/dogs/:dogId 正在处理请求,因为它是在 GET api/dogs/:dogname.

之前写入的

要解决此问题,请尝试更改 api 设计或使用不同的 HTTP 请求方法。例如:

POST api/dogs/:dogId
GET api/dogs/:dogName

or GET api/animals/dogs/:dogId
   GET api/dogs/:dogName

但不要这样做:

   GET api/dogs/:dogId
   GET api/dogs/:dogName

正如@Mohammad Ismail 已经指出的,您需要使用不同的 HTTP 方法来区分 2 个路由。

还有一种方法是使用query代替param
您发送 localhost:3000/api/dog?dogName=abc
这样的请求 然后在您的代码中:req.query.dogName 将为您提供值 abc