Как получить доступ к параметрам GET после "?" в Экспресс?
Я знаю, как получить параметры для запросов следующим образом:
app.get('/sample/:id', routes.sample);
В этом случае я могу использовать req.params.id
для получения параметра (например, 2
в /sample/2
).
Однако, для url как /sample/2?color=red
, как я могу получить доступ к переменной color
?
Я попробовал req.params.color
, но это не сработало.
Ответы
Ответ 1
Итак, после проверки экспресс-ссылки я обнаружил, что req.query.color
возвращает мне req.query.color
значение.
req.params относится к элементам с ':' в URL, а req.query относится к элементам, связанным с '?'
Пример:
GET /something?color1=red&color2=blue
Затем в экспресс, обработчик:
app.get('/somthing',(req,res) => {
req.query.color1 === "red"; //true
req.query.color2 === "blue"; // true
});
Ответ 2
Используйте req.query, чтобы получить значение в параметре строки запроса в маршруте.
Обратитесь 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);
});
Ответ 3
Обновление: req.param()
теперь устарело, поэтому в дальнейшем не используйте этот ответ.
Ваш ответ - предпочтительный способ сделать это, однако я думал, что хочу указать, что вы также можете получить доступ к параметрам url, post и route с помощью req.param(parameterName, defaultValue)
.
В вашем случае:
var color = req.param('color');
Из справочника:
поиск выполняется в следующем порядке:
- req.params
- req.body
- req.query
Обратите внимание, что в руководстве указано следующее:
Прямой доступ к req.body, req.params и req.query должен быть предпочтительнее для ясности - если вы действительно не принимаете ввод от каждого объекта.
Однако на практике я действительно нашел req.param()
достаточно ясным и упростил некоторые типы рефакторинга.
Ответ 4
Ответ на @Zugwait правильный. req.param()
устарел. Вы должны использовать req.params
, req.query
или req.body
.
Но просто для того, чтобы яснее:
req.params
будет заполнено только значениями маршрута. То есть, если у вас есть маршрут типа /users/:id
, вы можете получить доступ к id
либо в req.params.id
, либо req.params['id']
.
req.query
и req.body
будут заполнены всеми параметрами независимо от того, находятся они или нет в маршруте. Разумеется, параметры в строке запроса будут доступны в req.query
, а параметры в теле сообщения будут доступны в req.body
.
Итак, отвечая на ваши вопросы, поскольку color
не находится на маршруте, вы можете получить его с помощью req.query.color
или req.query['color']
.
Ответ 5
Строка запроса и параметры разные.
Вы должны использовать оба в одном URL маршрутизации
Пожалуйста, проверьте приведенный ниже пример может быть полезным для вас.
app.get('/sample/:id', function(req, res) {
var id = req.params.id; //or use req.param('id')
................
});
Получить ссылку для передачи вашего второго сегмента, ваш пример id: http://localhost: port/sample/123
Если вы столкнулись с проблемой, используйте переменную Passing в качестве строки запроса, используя '?' оператор
app.get('/sample', function(req, res) {
var id = req.query.id;
................
});
Получить ссылку, как этот пример: http://localhost: порт/образец? 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
Ответ 6
В экспресс-руководстве говорится, что вы должны использовать req.query для доступа к QueryString.
// Requesting /display/post?size=small
app.get('/display/post', function(req, res, next) {
var isSmall = req.query.size === 'small'; // > true
// ...
});
Ответ 7
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!')
)
Ответ 8
Хорошая техника, с которой я начал работать с некоторыми из моих приложений на экспресс, - это создать объект, который объединяет поля запроса, 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";
}
}