使用Express + Node在查询字符串中传递多个参数的路由

5

我正在使用Node构建API,并且在尝试解决一些问题。具体来说,我知道如何构建类型为/api/:paramA/:paramB的路由。在这种情况下,有两个参数。

代码应该像这样:

router.get('/test/:paramA/:paramB', function(req, res) {
    res.json({ message: 'hooray! welcome to our api!' + req.params.paramA + req.params.paramB});   
});

如何构建一个路由来响应类似于/api?paramA=valueA&paramB=valueB这样的请求?

4个回答

17

要在Express中使用此URL:

 /api?paramA=valueA&paramB=valueB

你需要这样做:
router.get('/api', function(req, res) {
    console.log(req.query.paramA);     // valueA
    console.log(req.query.paramB);     // valueB
    console.log(req.query.paramC);     // undefined (doesn't exist)
});

查询参数被解析成req.query对象。如果查询参数名称在查询字符串中不存在,则该属性将不会存在于query.query对象上,尝试读取它将返回undefined。请记住,所有值都将是字符串类型。如果您希望它们是数字或其他数据类型,则必须将它们解析为该数据类型。


5
我最终使用了这个。这段代码完全实现了我在原问题中设定的目标。
router.get('/api', function(req, res) {
    if(typeof req.query.paramA !== 'undefined' && typeof req.query.paramB !== 'undefined') {
    let paramA = req.query.paramA,   
        paramB = req.query.paramB;
    //do something with paramA and paramB
   }
});

这不是推荐的做法。req.query 是从查询字符串中访问解析参数的正确位置。 - jfriend00
是的,当然。谢谢你指出这个问题!我复制代码的时候弄错了。 - MadPhysicist

4

在路由器中定义url参数更容易。

示例URL:http://www.example.com/api/users/3&0

router.get('/api/users/:id&:pending', function (req, res) {
  console.log(req.params.id);
  console.log(req.params.pending);
});

1
如果您确定正在传递的GET参数,那么可以轻松地这样做:
router.get('/api', function(req, res) {
    if(typeof req.params.paramA !== 'undefined' && typeof req.params.paramB !== 'undefined') {
    let paramA = req.params.paramA,   
        paramB = req.params.paramB;
    //do something with paramA and paramB
   }
});

如果我需要检查两个参数是否都存在怎么办? - MadPhysicist
那么,对于那种情况,这仍然是一个可靠的解决方案吗? - MadPhysicist
我必须执行以下操作才能使其正常工作:let paramA = req.param('paramA'), paramB = req.param('paramB'); - MadPhysicist
引用自Express 4.x API - "req.param(name [, defaultValue])已被弃用。请使用req.params、req.body或req.query,视情况而定。 为了清晰起见,应优先直接访问req.body、req.params和req.query - 除非您真正接受每个对象的输入。" - Gonras Karols
这个答案似乎在路由定义中缺少:paramA:paramB - jfriend00
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接