web-dev-qa-db-fra.com

node.js avec express comment supprimer la chaîne de requête de l'URL

J'ai un bouton qui effectue un accès à ma page et ajoute un filtre à la chaîne de requête. Mon code applique ce filtre à la grille ... mais l'utilisateur peut supprimer/modifier ce filtre. Puisqu'ils peuvent voir quel filtre a été appliqué dans la grille, je voudrais supprimer le? Filter = blah de la chaîne de requête lorsque la page est affichée. (Cela peut être déroutant si sur la page et l'URL indique? Filter = columnA qui est correct au départ, mais l'utilisateur supprime ce filtre et en applique un nouveau sur columnB .... mais la chaîne de requête dit toujours? Filter-columnA. La grille peut gérer le changement de filtres sans nécessiter de publication.) Comment puis-je le faire? Et si vous ne pouvez pas supprimer/mettre à jour une chaîne de requête, est-il possible de l'analyser et de le rediriger vers la page principale sans la chaîne de requête? Une fois le filtre enregistré dans le filtre var, je n’en ai plus besoin dans la chaîne de requête.

voici le code qui affiche la 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
            }
    });

};
21
dan27

Utilisez url.parse() pour obtenir les composants de votre adresse, à savoir req.url. L'URL sans la chaîne de requête est stockée dans la propriété pathname.

Utilisez express 'redirect pour envoyer la nouvelle adresse de page.

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

Node docs pour url .

43

N'utilisez pas un module pour faire quelque chose comme ça: 

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

L'URL complète est stockée dans req.url dans votre cas, utilisez url.parse () de node.js pour extraire les parties. Prenez le chemin et envoyez un en-tête Location en utilisant res.set() pour rediriger vers une URL sans la chaîne de requête. 

var url = require('url');
res.set('Location', url.parse(req.url).pathname);
4
SamT
// 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);

}
3
Alexander Gonchiy

Afin d'éviter de recharger la page en forçant une redirection, j'ai ajouté ce qui suit à la section <head> de mon fichier .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>

Source: http://atodorov.org/blog/2013/01/28/remove-query-string-with-javascript-and-html5/

0
Incinerator

J'avais un problème similaire et la façon dont je l'ai abordé a été d'ajouter un script dans la section. Toutefois, afin d’éviter les incohérences lorsqu’il s’agissait de revenir en arrière ou d’avancer, je devais ajouter un écouteur onbeforeunload event. L'avantage de cette approche est qu'elle évite la redirection.


 // Stocke l'URL d'origine dans le stockage local 
 window.localStorage.setItem ('spécifiée', window.location.href); 

 // Nettoie le paramètre de requête d'une chaîne et le remplace dans l'API d'historique 
 const cleanUrl = location.href.match (/^.+(?=\?)/ g); 
 window.history.replaceState (null, null, (cleanUrl? cleanUrl [0]: location.href)); ;________. // l'historique est mis à jour avant le rechargement de la fenêtre 
 window.onbeforeunload = () => {
 window.history.replaceState (null, null, window.localStorage.getItem ('spécifiée')); ;__. } 

Le seul problème que j’imagine est l’incompatibilité des navigateurs, le moteur JavaScript ne pouvant pas prendre en charge un opérateur de recherche de regex. Ceci peut être facilement résolu en utilisant .split ('?') [0] 

0
Marios Simou