7

Как получить параметры GET после "?" в Express?

1

Я знаю, как получить параметры для запросов, подобных этому:

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

В этом случае я могу использовать req.params.id, чтобы получить параметр (например, 2 в /sample/2).

Однако для URL, такого как /sample/2?color=red, как я могу получить переменную color?

Я пробовал использовать req.params.color, но это не сработало.

5 ответ(ов)

0

Ответ @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'].

0

Ваш код представляет собой приложение на Express.js, которое управляет пользователями и их работой. Давайте разберем, как он работает, и в чем могут быть недостатки.

  1. Импорт модулей: Вы используете express, body-parser, а также функции из вашего модуля db.js, чтобы управлять данными пользователей и работ.

  2. Настройка приложения:

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

    Здесь вы устанавливаете Pug в качестве шаблонизатора и подключаете механизмы для обработки статических файлов и данных из тела запроса.

  3. Маршруты:

    • GET /: Получает список пользователей и отображает их с помощью Pug.
    • GET /api/company/users: Получает название компании из параметров запроса и отображает пользователей по этой работе.
    • POST /api/users/add и POST /users/add: Обрабатывают добавление новых пользователей. Вы забыли закрыть фигурную скобку в методе then в одном из этих маршрутов, что вызовет ошибку.
    • POST /api/user/company/add: Добавляет пользователя в компанию и возвращает результат в формате JSON. Также здесь нужно обрабатывать возможные ошибки.
    • GET /api/company/user: Также получает пользователей по названию компании.
  4. Ошибки:

    • В обоих маршрутах для добавления пользователя ошибка в коде: пропущена закрывающая фигурная скобка после then.
    • Логирование ошибок методом console.error — это хороший вариант для разработки, но в продакшене лучше использовать механизм логирования.
    • В GET маршруте для получения пользователей по работе вы не обрабатываете возможные ошибки.
  5. Запуск сервера:

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

    Сервер запускается на порту 3000.

Таким образом, у вас есть функциональное приложение, но убедитесь, что вы исправили ошибки в структуре кода и добавили соответствующую обработку ошибок. Удачи в разработке!

0

Вы можете просто использовать 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'.

0

Вы можете просто использовать app.get:

app.get('/some/page/here', (req, res) => {
    console.log(req.query.color); // Значение вашего цвета будет отображено
});

Вы можете ознакомиться с документацией API на expressjs.com: http://expressjs.com/en/api.html

0

Вот перевод на русский в стиле ответа на 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";
    }
}

Этот подход делает работу с данными запроса более удобной и структурированной.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь