如何访问“;”后的GET参数?在表达吗?

我知道如何获取查询的参数,像这样:

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

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

然而,对于像/sample/2?color=red这样的url,我如何访问变量color?

我试过req.params.color,但是没有用。

678820 次浏览

因此,在检查了表达参考之后,我发现req.query.color将返回我正在寻找的值。

要求的事情。params指的是URL和req中带有“:”的项。查询引用与'?'相关的项

例子:

GET /something?color1=red&color2=blue

然后在express中,处理程序:

app.get('/something', (req, res) => {
req.query.color1 === 'red'  // true
req.query.color2 === 'blue' // true
})

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


你的答案是首选的方式,但我想我要指出,你也可以访问url, post,和路由参数都用req.param(parameterName, defaultValue)

在你的情况下:

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

速递指南:

查找的顺序如下:

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

注意,指南中有如下规定:

直接访问req。身体,点播。Params和req。查询应该是 有利于清晰-除非你真正接受来自每个对象的输入

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

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

但我想说得更清楚一点:

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

req.queryreq.body将被所有参数填充,不管它们是否在路由中。当然,查询字符串中的参数将在req.query中可用,post body中的参数将在req.body中可用。

因此,回答你的问题,因为color不在路由中,你应该能够使用req.query.colorreq.query['color']获得它。

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

// Requesting /display/post?size=small
app.get('/display/post', function(req, res, next) {


var isSmall = req.query.size === 'small'; // > true
// ...


});

查询字符串和参数不一致。

你需要在单个路由url中使用两者

请检查下面的例子可能对你有用。

app.get('/sample/:id', function(req, res) {


var id = req.params.id; //or use req.param('id')


................


});

让链接通过你的第二个段是你的id示例:http://localhost:port/sample/123

如果你遇到问题,请使用'?的运营商

  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

< p >使用要求。查询,用于获取路由中查询字符串参数中的值。 参考# EYZ0。 如果在一个路由中,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);


});

我已经开始在express上的一些应用程序中使用的一个很好的技术是创建一个对象,它合并了express的request对象的查询、params和body字段。

//./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中使用了这种技术,我还将身份验证/授权数据存储在这个对象上,示例如下。

/*
* @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";
}
}
const express = require('express')
const bodyParser = require('body-parser')
const { usersNdJobs, userByJob, addUser , addUserToCompany } = require ('./db/db.js')


const app = express()
app.set('view engine', 'pug')
app.use(express.static('public'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())


app.get('/', (req, res) => {
usersNdJobs()
.then((users) => {
res.render('users', { users })
})
.catch(console.error)
})


app.get('/api/company/users', (req, res) => {
const companyname = req.query.companyName
console.log(companyname)
userByJob(companyname)
.then((users) => {
res.render('job', { users })
}).catch(console.error)
})


app.post('/api/users/add', (req, res) => {
const userName = req.body.userName
const jobName = req.body.jobName
console.log("user name = "+userName+", job name : "+jobName)
addUser(userName, jobName)
.then((result) => {
res.status(200).json(result)
})
.catch((error) => {
res.status(404).json({ 'message': error.toString() })
})
})
app.post('/users/add', (request, response) => {
const { userName, job } = request.body
addTeam(userName, job)
.then((user) => {
response.status(200).json({
"userName": user.name,
"city": user.job
})
.catch((err) => {
request.status(400).json({"message": err})
})
})


app.post('/api/user/company/add', (req, res) => {
const userName = req.body.userName
const companyName = req.body.companyName
console.log(userName, companyName)
addUserToCompany(userName, companyName)
.then((result) => {
res.json(result)
})
.catch(console.error)
})


app.get('/api/company/user', (req, res) => {
const companyname = req.query.companyName
console.log(companyname)
userByJob(companyname)
.then((users) => {
res.render('jobs', { users })
})
})


app.listen(3000, () =>
console.log('Example app listening on port 3000!')
)

你可以简单地使用req.query作为get查询参数:

app.get('/', (req, res) => {
let color1 = req.query.color1
let color2 = req.query.color2
})

url模块提供了用于URL解析和解析的实用程序。URL解析不使用Express:

const url = require('url');
const queryString = require('querystring');


let rawUrl = 'https://stackoverflow.com/?page=2&size=3';


let parsedUrl = url.parse(rawUrl);
let parse = queryString.parse(parsedUrl.query);


// parse = { page: '2', size: '3' }

另一种方法:

const url = require('url');


app.get('/', (req, res) => {
const queryObject = url.parse(req.url,true).query;
});

url.parse(req.url,true).query返回{ color1: 'red', color2: 'green' }.
url.parse(req.url,true).host返回'localhost:8080'.
url.parse(req.url,true).search返回'?color1=红色&color2=绿色'.

只需使用app.get:

app.get('/some/page/here', (req, res) => {
console.log(req.query.color) // Your color value will be displayed
})
你可以在expressjs.com的文档api上看到它: # EYZ0 < / p >