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

标签 node.js rest express

背景

出于学习目的,我正在编写示例 nodejs/express REST 接口(interface)或 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');
});

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

最佳答案

Do I need to create two separate methods, one that accepts a parameter and one that doesn't?

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

答案是肯定的。

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

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

关于node.js - node/express REST API 应用程序 - 将参数传递给 GET 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39750550/

相关文章:

node.js - Derbyjs:如何使用无浏览器 socket.io-client 连接到它

javascript - 如何从 webpack.config.js 文件访问环境变量?

java - Jersey POST 方法正在接收空值作为参数

python - 性能改进 - 使用 Get 方法循环

javascript - 如何在 Node.js 中追加到新行

javascript - 使 socket.io 在 Node.js 中的 API 端点内工作

django - 如何向使用 Django REST 框架创建的 REST API 添加 token 身份验证

node.js - 如何使用 Nginx 在 MEAN 堆栈应用程序上正确设置 HTTPS/SSL

node.js - 关闭浏览器选项卡 nodejs

node.js - Express 和 Redis - 如果该用户存在 session ,则不允许访问