问题
I have a button that is performing a get to my page and adding a filter to the query string. My code applies that filter to the grid...but the user can remove/edit that filter. Since they can see what filter was applied in the grid, I would like to remove the ?filter=blah from the query string when the page is displayed. (It might be confusing if on the page and the URL says ?filter=columnA which is correct initially, but the user removes that filter and applies a new one on columnB....but the query string still says ?filter-columnA. The grid can handle changing filters without needing a post back.) How can I do that? And if you cannot remove/update a query string, is it possible to parse it and then just redirect to the main page without the query string? Once I have the filter saved to var filter, I no longer need it in the query string.
here is the code that displays the page
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:
Use url.parse()
to get the components of your address, which is req.url
. The url without the query string is stored in the pathname
property.
Use express' redirect
to send the new page address.
const url = require('url'); // built-in utility
res.redirect(url.parse(req.url).pathname);
Node docs for url.
回答2:
Don't use a module for doing something like that:
res.redirect( req.originalUrl.split("?").shift() );
回答3:
Express 4.x+ answer:res.redirect(req.path)
回答4:
// 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);
}
回答5:
The full url is stored in req.url
in your case, use node.js's url.parse() to pull out the parts. Take the path and send a Location header using res.set()
to redirect to URL without the query string.
var url = require('url');
res.set('Location', url.parse(req.url).pathname);
回答6:
Use req.path
If your endpoint is http://<your-domain>.com/hello/there?name=john
...
then req.path
= /hello/there
Documetation: https://expressjs.com/en/api.html#req.path
回答7:
In order to avoid reload the page by forcing a redirect, I added the following to the <head>
section of my .ejs file:
<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>
Source: http://atodorov.org/blog/2013/01/28/remove-query-string-with-javascript-and-html5/
回答8:
I had a similar issue and the way that I approached it was by adding a script in the section. However, in order to avoid inconsistencies when I was moving either backward or forward I needed to add an onbeforeunload event listener. The benefit of that approach is that it avoids the redirection.
// 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')); }
The only issue that I imagine is browser incompatibility, with the JavaScript engine not being able to support a regex look-behind operator. This can be easily fixed using .split('?')[0]
来源:https://stackoverflow.com/questions/14166898/node-js-with-express-how-to-remove-the-query-string-from-the-url