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

11

背景

我正在编写一个样例的Node.js/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}
也许获取所有记录的正确方法类似于这样:
 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个回答

19

我需要创建两个不同的方法,一个接受参数,一个不接受吗?

我猜你发帖之前没有尝试过这个?

答案是肯定的。

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

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

不,我已经尝试过了。但是因为我是一个 Node.js 新手,我怀疑我的方法是否正确。而且我也没有你这里的“:”。如果我有一个 routes/emergency.js 文件,其中包含所有这些逻辑,那么我实际上需要在你的答案中使用 '/emergency/:id' 中的 'emergency' 吗?我认为我不需要。 - Happydevdays
你编辑的代码很好。我不理解你在评论中提出的第二个问题。采用两种路由的方法是可行的,它简单而且有效。 - Tom
Tom,请查看我原始问题中的“编辑1”部分。 - Happydevdays
不确定你还想要什么 - Express 不会改变他们处理路由的方式,因为你的大脑期望系统以不同的方式工作。 - Tom
Tom,我明白了。我觉得你没有理解我的问题重点。因为我对这个工具不熟悉,所以我想要确认一下我目前对于如何使用它的理解是否正确。 - Happydevdays
没问题,它很简单并且有效,没有其他需要。 - Tom

1

是的,有两个不同的函数监听每种类型的URL是必要的。这是因为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方法获取参数的过程。

0

我不确定这是否有效,你可以尝试类似这样的东西

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

谢谢您的建议!我尝试了一下,当我不带参数时可以运行,但是当我传递参数时,它会出现404错误。如果Express/Node不设计成这样工作的话...没关系。我只是想了解如何正确地设计我的应用程序。 - Happydevdays

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