node / express REST API应用程序 - 将参数传递给GET方法

时间:2016-09-28 14:34:18

标签: node.js rest express

背景

我正在编写一个示例nodejs / express REST接口或API用于学习目的。我创建了一条名为" emergency"的新路线。

在文件中我有以下代码:

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');
});

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

3 个答案:

答案 0 :(得分:9)

  

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

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

答案是肯定的。

接受参数的路线应如下所示:

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

答案 1 :(得分:1)

是的,有两种不同的功能可以监听每种类型的网址。 这是因为 网址

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方法获取参数的过程的详细说明。

答案 2 :(得分:0)

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

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