node.js with express how to remove the query string from the url

假如想象 提交于 2020-01-10 09:22:31

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!