Как получить параметры GET после "?" в Express?
Я знаю, как получить параметры для запросов, подобных этому:
app.get('/sample/:id', routes.sample);
В этом случае я могу использовать req.params.id
, чтобы получить параметр (например, 2
в /sample/2
).
Однако для URL, такого как /sample/2?color=red
, как я могу получить переменную color
?
Я пробовал использовать req.params.color
, но это не сработало.
5 ответ(ов)
Ответ @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
, а параметры в теле POST-запроса — в req.body
.
Таким образом, отвечая на ваш вопрос: поскольку color
не указан в маршруте, вы сможете получить его, используя req.query.color
или req.query['color']
.
Ваш код представляет собой приложение на Express.js, которое управляет пользователями и их работой. Давайте разберем, как он работает, и в чем могут быть недостатки.
Импорт модулей: Вы используете
express
,body-parser
, а также функции из вашего модуля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());
Здесь вы устанавливаете Pug в качестве шаблонизатора и подключаете механизмы для обработки статических файлов и данных из тела запроса.
Маршруты:
- GET
/
: Получает список пользователей и отображает их с помощью Pug. - GET
/api/company/users
: Получает название компании из параметров запроса и отображает пользователей по этой работе. - POST
/api/users/add
и POST/users/add
: Обрабатывают добавление новых пользователей. Вы забыли закрыть фигурную скобку в методеthen
в одном из этих маршрутов, что вызовет ошибку. - POST
/api/user/company/add
: Добавляет пользователя в компанию и возвращает результат в формате JSON. Также здесь нужно обрабатывать возможные ошибки. - GET
/api/company/user
: Также получает пользователей по названию компании.
- GET
Ошибки:
- В обоих маршрутах для добавления пользователя ошибка в коде: пропущена закрывающая фигурная скобка после
then
. - Логирование ошибок методом
console.error
— это хороший вариант для разработки, но в продакшене лучше использовать механизм логирования. - В GET маршруте для получения пользователей по работе вы не обрабатываете возможные ошибки.
- В обоих маршрутах для добавления пользователя ошибка в коде: пропущена закрывающая фигурная скобка после
Запуск сервера:
app.listen(3000, () => console.log('Example app listening on port 3000!') );
Сервер запускается на порту 3000.
Таким образом, у вас есть функциональное приложение, но убедитесь, что вы исправили ошибки в структуре кода и добавили соответствующую обработку ошибок. Удачи в разработке!
Вы можете просто использовать req.query
для получения параметров запроса:
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=red&color2=green'.
Вы можете просто использовать app.get
:
app.get('/some/page/here', (req, res) => {
console.log(req.query.color); // Значение вашего цвета будет отображено
});
Вы можете ознакомиться с документацией API на expressjs.com: http://expressjs.com/en/api.html
Вот перевод на русский в стиле ответа на StackOverflow:
Я начал использовать интересную технику в некоторых своих приложениях на Express, которая позволяет создавать объект, объединяющий поля query
, params
и body
объекта запроса Express.
Вот пример реализации:
//./express-data.js
const _ = require("lodash");
class ExpressData {
/*
* @param {Object} req - объект запроса Express
*/
constructor (req) {
// Объединяем все данные, переданные клиентом в запросе
this.props = _.merge(req.body, req.params, req.query);
}
}
module.exports = ExpressData;
Затем в вашем контроллере или в любом другом месте в области видимости цепочки запроса Express вы можете использовать следующий код:
//./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;
// При запросе "/592363122?foo=bar&hello=world"
// ниже будет выведен следующий лог
// {
// some_id: 592363122,
// foo: 'bar',
// hello: 'world'
// }
console.log(props);
return res.json(props);
});
Это позволяет легко "погружаться" во все "настраиваемые данные", которые пользователь мог отправить в своем запросе.
Примечание
Почему поле props
? Потому что это сокращенный фрагмент кода. Я использую эту технику во многих своих API. Также я сохраняю данные для аутентификации/авторизации в этом объекте, как показано ниже.
/*
* @param {Object} req - объект ответа на запрос
*/
class ExpressData {
/*
* @param {Object} req - объект запроса Express
*/
constructor (req) {
// Объединяем все данные, переданные клиентом в запросе
this.props = _.merge(req.body, req.params, req.query);
// Сохраняем ссылку на пользователя
this.user = req.user || null;
// Устройства, подключенные к API (мобильное приложение и т. д.), будут отправлять заголовок x-client с запросами; веб-контекст подразумевается.
// Это используется для определения того, как пользователь подключается к API
this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web";
}
}
Этот подход делает работу с данными запроса более удобной и структурированной.
Как получить переменные GET (строки запроса) в Express.js на Node.js?
Запись в файлы в Node.js
Ошибка "npm WARN package.json: Нет поля repository"
Как предотвратить установку "devDependencies" модулей NPM для Node.js (package.json)?
Как исправить ошибку "ReferenceError: primordials is not defined" в Node.js