如何在Express中使用“?”后访问GET参数?

我知道如何得到像这样的查询params:

app.get('/sample/:id', routes.sample); 

在这种情况下,我可以使用req.params.id获取参数(例如2 in /sample/2 )。

但是,对于像/sample/2?color=red这样的url,我怎样才能访问variables的color

我试过req.params.color但没有奏效。

所以,在检查了快速参考后 ,我发现req.query.color将返回我正在寻找的值。

更新: req.param()现在被弃用,所以前进不要使用这个答案。


你的答案是这样做的首选方法,但我想我会指出,你也可以通过req.param(parameterName, defaultValue)访问url,post和路由参数。

在你的情况下:

 var color = req.param('color'); 

从快递指南:

查找按以下顺序执行:

  • req.params
  • req.body
  • req.query

请注意,指南的状态如下:

直接访问req.body,req.params和req.query应该更加清晰 – 除非您确实接受来自每个对象的input。

然而在实践中,我已经发现req.param()足够清晰,并且使某些types的重构更容易。

使用req.query,获取他在路由查询string参数中的值。 请参阅req.query 。 如果在一个路由中, http:// localhost:3000 /?name = satyam,你想获得name参数的值,那么你的'Get'路由处理程序将会像这样:

 app.get('/', function(req, res){ console.log(req.query.name); res.send('Response send to client::'+req.query.name); }); 

@ Zugwait的答案是正确的。 req.param()已被弃用。 你应该使用req.paramsreq.queryreq.body

但只是为了更清楚:

req.params将只填充路由值。 也就是说,如果您有像/users/:id这样的路由,您可以在req.params.idreq.params['id']访问该id

req.queryreq.body将被填充所有参数,不pipe它们是否在path中。 当然,查询string中的参数将在req.query可用,并且post主体中的参数将在req.body可用。

所以,回答你的问题,因为color不在路线中,你应该能够使用req.query.colorreq.query['color']来获取它。

嘿查询string和参数是不同的。

您需要在单个路由url中使用这两个选项

请检查下面的示例我的帮助你。

 app.get('/sample/:id', function(req, res) { var id = req.params.id; //or use req.param('id') ................ }); 

获取链接传递你的第二段是你的id示例: http:// localhost:port / file-upload / 123

如果遇到问题,请使用'?'作为查询string传递variables。 操作者

  app.get('/sample', function(req, res) { var id = req.query.id; ................ }); 

获取链接你喜欢这个例子: http:// localhost:port / sample?id = 123

无论在单一的例子

 app.get('/sample/:id', function(req, res) { var id = req.params.id; //or use req.param('id') var id2 = req.query.id; ................ }); 

发布链接示例示例: http:// localhost:port / sample / 123?id = 123

快速手册说,你应该使用req.query来访问QueryString。

 // Requesting /display/post?size=small app.get('/display/post', function(req, res, next) { var isSmall = req.query.size === 'small'; // > true // ... }); 

我已经开始使用我的一些快速应用程序的一个很好的技术是创build一个对象,它将快速请求对象的查询,参数和主体字段合并在一起。

 //./express-data.js const _ = require("lodash"); class ExpressData { /* * @param {Object} req - express request object */ constructor (req) { //Merge all data passed by the client in the request this.props = _.merge(req.body, req.params, req.query); } } module.exports = ExpressData; 

然后在你的控制器主体或其他地方的快速请求链的范围内,你可以使用如下所示:

 //./some-controller.js const ExpressData = require("./express-data.js"); const router = require("express").Router(); router.get("/:some_id", (req, res) => { let props = new ExpressData(req).props; //Given the request "/592363122?foo=bar&hello=world" //the below would log out // { // some_id: 592363122, // foo: 'bar', // hello: 'world' // } console.log(props); return res.json(props); }); 

这使得它可以“钻研”用户可能发送的所有“自定义数据”的请求。

注意

为什么“道具”字段? 因为这是一个精简的片段,所以我在一些API中使用了这种技术,我也将authentication/授权数据存储在这个对象上,下面的例子。

 /* * @param {Object} req - Request response object */ class ExpressData { /* * @param {Object} req - express request object */ constructor (req) { //Merge all data passed by the client in the request this.props = _.merge(req.body, req.params, req.query); //Store reference to the user this.user = req.user || null; //API connected devices (Mobile app..) will send x-client header with requests, web context is implied. //This is used to determine how the user is connecting to the API this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web"; } }