web-dev-qa-db-ja.com

URLからクエリ文字列を削除する方法を明示したnode.js

ページにアクセスし、クエリ文字列にフィルターを追加するボタンがあります。私のコードはそのフィルターをグリッドに適用します...しかし、ユーザーはそのフィルターを削除/編集できます。グリッドに適用されているフィルターを確認できるため、ページが表示されたときにクエリ文字列から?filter = blahを削除したいと思います。 (ページ上でURLが?filter = columnAを最初に正しいと言っている場合、混乱するかもしれませんが、ユーザーはそのフィルターを削除し、columnB ....に新しいフィルターを適用しますが、クエリ文字列はまだ?filter-columnAと言います。グリッドはポストバックを必要とせずにフィルターの変更を処理できます。どうすればよいですか?そして、クエリ文字列を削除/更新できない場合、それを解析してからクエリ文字列なしでメインページにリダイレクトすることは可能ですか?フィルターをvarフィルターに保存すると、クエリ文字列でフィルターが不要になります。

ここにページを表示するコードがあります

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
            }
    });

};
28
dan27

url.parse()を使用して、住所のコンポーネント(req.url。クエリ文字列のないURLは、pathnameプロパティに保存されます。

Express 'redirectを使用して、新しいページアドレスを送信します。

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

Nodeurl のドキュメント。

そのようなことをするためにモジュールを使用しないでください:

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

Express 4.x +の回答:
res.redirect(req.path)

14
AjaxLeung
// 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

完全なURLは、_req.url_に保存されます。node.jsの rl.parse() を使用して、パーツを引き出します。パスを取得し、res.set()を使用してLocationヘッダーを送信し、クエリ文字列なしでURLにリダイレクトします。

_var url = require('url');
res.set('Location', url.parse(req.url).pathname);
_
4
SamT

リダイレクトを強制してページをリロードしないようにするために、<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/

1
Incinerator

req.pathを使用

エンドポイントがhttp://<your-domain>.com/hello/there?name=john...の場合.

次にreq.path = /hello/there


ドキュメント: https://expressjs.com/en/api.html#req.path

1
Derek Soike

同様の問題があり、その方法はセクションにスクリプトを追加することでした。ただし、前後に移動するときに不整合を避けるために、onbeforeunloadイベントリスナーを追加する必要がありました。このアプローチの利点は、リダイレクトを回避できることです。

 
 //元のURLをローカルストレージに保存します
 window.localStorage.setItem( 'specifiedKey'、window.location.href); 
 
 //文字列のクエリパラメータを消去し、履歴API 
 constで置き換えますconst cleanUrl = location.href.match(/^.+(?=\?)/ g); 
 window.history.replaceState(null、null、(cleanUrl?cleanUrl [0]:location.href)); 
 
 //ウィンドウがリロードされる前に履歴が更新されます
 window.onbeforeunload =()=> {
 window.history.replaceState(null、null、window.localStorage.getItem( 'specifiedKey')); 
} 
 

私が想像する唯一の問題は、ブラウザの非互換性であり、JavaScriptエンジンは正規表現の後ろ読み演算子をサポートできません。これは.split( '?')[0]を使用して簡単に修正できます

0
Marios Simou