如何在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.params
, req.query
或req.body
。
但只是为了更清楚:
req.params
将只填充路由值。 也就是说,如果您有像/users/:id
这样的路由,您可以在req.params.id
或req.params['id']
访问该id
。
req.query
和req.body
将被填充所有参数,不pipe它们是否在path中。 当然,查询string中的参数将在req.query
可用,并且post主体中的参数将在req.body
可用。
所以,回答你的问题,因为color
不在路线中,你应该能够使用req.query.color
或req.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"; } }