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