【问题标题】:node / express REST API application - passing parameters to GET method节点/快递 REST API 应用程序 - 将参数传递给 GET 方法
【发布时间】:2017-02-06 14:43:33
【问题描述】:

背景

出于学习的目的,我正在编写一个示例 nodejs / express REST 接口或 API。我创建了一条名为“紧急”的新路线。

在文件中我有以下代码:

router.get('/', function(req, res, next) {
        //var ip = req.params.ip;
        res.send('respond with a resource');
});

当我启动应用程序并导航到http://myserver/tutorial1/emergency 一切正常,我看到“使用资源响应”消息。

目标

我希望我的应用程序也能够接受参数。例如,当用户导航到

 http://myserver/tutorial1/emergency

我希望查询并返回所有紧急电话号码。但他们也应该能够做到这一点:

 http://myserver/tutorial1/emergency/12345

系统应查询数据库中的紧急记录 12345 并返回相应的结果集。

问题/疑问

为了适应这两种类型的 GET 查询,我将代码更改为如下所示:

router.get('/id', function(req, res, next) {
        //var ip = req.params.ip;
        res.send('respond with a resource');
});

现在当我运行应用程序并浏览到

 http://myserver/tutorial1/emergency/12345

它有效。但是,浏览到

  http://myserver/tutorial1/emergency 

失败并显示 404 错误消息。

找不到

404

Error: Not Found
    at /var/www/html/nodejs_samples/tutorial1/app.js:34:13
    at Layer.handle [as handle_request] (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:312:13)
    at /var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:280:7
    at Function.process_params (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:330:12)
    at next (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:271:10)
    at /var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:618:15
    at next (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:256:14)
    at Function.handle (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:176:3)
    at router (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:46:12)

我是否需要创建两个单独的方法,一个接受参数,一个不接受? (又名方法重载?) 也许我对 REST 的理解是错误的。 GET 请求应该是这样的:

 http://myserver/tutorial1/emergency

或者它应该总是这样:

 http://myserver/tutorial1/emergency/{id}

也许对所有记录执行 GET 的正确方法是这样的:

 http://myserver/tutorial1/emergency/all

我现在也在尝试用谷歌搜索我的问题,但我很难简洁地表达它以获得准确的搜索结果集。

编辑 1

当我尝试创建两种方法时,这就是我的代码的样子(这很有效)

router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

router.get('/:id', function(req, res, next) {
        var id = req.params.id;
        console.log(id);
        res.send('got it');
});

但这感觉很奇怪,因为我想我已经习惯了其他语言的其他框架,系统可以检查空参数,所以你只需要一种方法。 这不是投诉!只是一个评论,可以解释为什么我的大脑“期望”系统以不同的方式工作。

【问题讨论】:

    标签: node.js rest express


    【解决方案1】:

    我是否需要创建两个单独的方法,一个接受参数 一个没有?

    我猜你在尝试之前就发布了这个?

    答案是肯定的。

    你的接受参数的路由应该是这样的:

    app.get('/emergency/:id', function (req, res, next) {
        var id = req.params.id;
        console.log('The id: ' + id);
    });
    

    【讨论】:

    • 不,我试过了。但是因为我是一个节点 js 菜鸟,所以我质疑我的方法是否正确。我也错过了你在这里的“:”。如果我有一个包含所有这些逻辑的 routes/emergency.js 文件,我真的需要你在答案中的“/emergency/:id”中的“紧急情况”吗?我不认为我这样做
    • 您编辑的代码很好。我不明白你评论中的第二个问题。两条路线的方法很好,它简单而且有效。
    • Tom,请参阅我原始问题中的“编辑 1”部分
    • 不确定您还想要什么 - Express 与他们处理路由的方式无关,因为您的大脑期望系统以不同的方式工作。
    • 哈哈。汤姆,我意识到这一点。我认为你错过了我的问题的重点。因为我对这个工具没有经验,所以我要求验证我目前对如何使用它的理解。
    【解决方案2】:

    是的,必须有两个不同的函数来监听每种类型的 url。 这是因为 网址

    http://localhost/example/abcd will get received in 
    router.get('/example/:username',testFunction1);
    

    http://localhost/example will be received in 
    router.get('/example',testFunction2);
    

    参考文章:http://codewhoop.com/article/Nodejs%20Getting%20parameters%20through%20GET%20method 详细解释Nodejs中通过GET方法获取参数的过程。

    【讨论】:

      【解决方案3】:

      我不确定它是否有效,你可以尝试这样的事情

      app.get('/emergency/:var(:id/|)', function (req, res, next) {
          var id = req.params.id;
          console.log('The id: ' + id);
      });
      

      【讨论】:

      • 感谢您的建议!我试了一下,当我尝试不带参数时它就可以工作。但是当我通过一个参数时,它会以 404 失败。如果 express / node 不是设计为以这种方式工作......没关系。我只是想了解设计我的应用程序的“正确”方式是什么。
      猜你喜欢
      • 2018-01-15
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2018-01-27
      • 2015-03-13
      • 1970-01-01
      相关资源
      最近更新 更多