Node.js с выражением, как удалить строку запроса из URL-адреса

У меня есть кнопка, которая выполняет переход на мою страницу и добавление фильтра в строку запроса. Мой код применяет этот фильтр к сетке... но пользователь может удалить/отредактировать этот фильтр. Поскольку они могут видеть, какой фильтр был применен в сетке, я хотел бы удалить? Filter = blah из строки запроса при отображении страницы. (Возможно, это сбивает с толку, если на странице и в URL-адресе написано: filter = columnA, который корректно изначально, но пользователь удаляет этот фильтр и применяет новый в столбцеB.... но строка запроса все еще говорит? Filter-columnA. Сетка может обрабатывать изменение фильтров, не требуя сообщения назад.) Как я могу это сделать? И если вы не можете удалить/обновить строку запроса, можно ли ее проанализировать, а затем просто перенаправить на главную страницу без строки запроса? Как только фильтр, сохраненный в var filter, мне больше не нужен в строке запроса.

вот код, который отображает страницу

exports.show = function(req, res) {
    var filter = req.query.filter;
    if (filter === null || filter === "") {
        filter = "n/a";
    }

    res.render("somepage.jade", {
            locals: {
                title: "somepage",
                filter: filter
            }
    });

};

Ответ 1

Используйте url.parse(), чтобы получить компоненты вашего адреса, который равен req.url. URL-адрес без строки запроса сохраняется в свойстве pathname.

Используйте экспресс 'redirect для отправки нового адреса страницы.

const url = require('url'); // built-in utility
res.redirect(url.parse(req.url).pathname);

Node docs для url.

Ответ 2

Не используйте модуль для выполнения чего-то подобного:

res.redirect( req.originalUrl.split("?").shift() );

Ответ 3

Экспресс 4.x + ответ:
res.redirect(req.path)

Ответ 4

Полный URL-адрес хранится в req.url в вашем случае, используйте node.js url.parse(), чтобы вытащить частей. Возьмите путь и отправьте заголовок местоположения, используя res.set(), чтобы перенаправить URL-адрес без строки запроса.

var url = require('url');
res.set('Location', url.parse(req.url).pathname);

Ответ 5

// load built-in utilities for URL resolution and parsing
var url = require('url');

function removeQueryString(url){

  // split url into distinct parts
  // (full list: https://nodejs.org/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost)
  var obj = url.parse(url);

  // remove the querystring
  obj.search = obj.query = "";

  // reassemble the url
  return url.format(obj);

}

Ответ 6

Чтобы избежать перезагрузки страницы путем принудительного перенаправления, я добавил следующее в раздел <head> моего файла .ejs:

<script type="text/javascript">
    var uri = window.location.toString();
    if (uri.indexOf("?") > 0) {
        var clean_uri = uri.substring(0, uri.indexOf("?"));
        window.history.replaceState({}, document.title, clean_uri);
    }
</script>

Источник: http://atodorov.org/blog/2013/01/28/remove-query-string-with-javascript-and-html5/

Ответ 7

У меня была похожая проблема, и я подошел к ней путем добавления сценария в раздел. Однако, чтобы избежать несоответствий, когда я двигался назад или вперед, мне нужно было добавить прослушиватель события onbeforeunload. Преимущество такого подхода состоит в том, что он избегает перенаправления.

    // Stores the original url in the local storage
    window.localStorage.setItem('specifiedKey', window.location.href);

    // Cleans the query parameter of a string and replace it in the history API
    const cleanUrl = location.href.match(/^.+(?=\?)/g);
    window.history.replaceState(null, null, (cleanUrl ? cleanUrl[0] : location.href));

    // the history is updated before the window reloads
    window.onbeforeunload = () => {
    window.history.replaceState(null, null, window.localStorage.getItem('specifiedKey'));
        }

Единственная проблема, которую я представляю, - это несовместимость браузера, так как движок JavaScript не может поддерживать оператор просмотра регулярных выражений. Это можно легко исправить с помощью .split('?') [0]

Ответ 8

Используйте req.path

Если вашей конечной точкой является http://<your-domain>.com/hello/there?name=john...

тогда req.path= /hello/there


Документация: https://expressjs.com/en/api.html#req.path