node.js用express表示如何从url中删除查询字符串

dan*_*n27 28 node.js query-string express

我有一个按钮正在执行到我的页面并向查询字符串添加过滤器.我的代码将该过滤器应用于网格...但用户可以删除/编辑该过滤器.由于他们可以看到在网格中应用了什么过滤器,我想在显示页面时从查询字符串中删除?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
            }
    });

};
Run Code Online (Sandbox Code Playgroud)

小智 52

使用url.parse()你的住址,这是组件req.url.没有查询字符串的url存储在pathname属性中.

使用express' redirect发送新的页面地址.

const url = require('url'); // built-in utility
res.redirect(url.parse(req.url).pathname);
Run Code Online (Sandbox Code Playgroud)

节点文档url.

  • 更现代的方法是使用“new URL(req.originalUrl).pathname”而不是“url.parse(req.url).pathname”。这可以让您避免加载 url 模块(`const url = require('url');` 行)。 (2认同)

Tim*_*Tim 24

不要使用模块做类似的事情:

res.redirect( req.originalUrl.split("?").shift() );
Run Code Online (Sandbox Code Playgroud)


Aja*_*ung 14

快递4.x +回答:
res.redirect(req.path)


Jak*_*kul 10

通用 Node.js 解决方案

> new URL('https://example.com/admin/new?foo=bar').pathname;
'/admin/new'
Run Code Online (Sandbox Code Playgroud)

如果您还想包括来源:

> const url = new URL('https://example.com/admin/new?foo=bar')
> url.search = '';
> url.toString() 
'https://example.com/admin/new'
Run Code Online (Sandbox Code Playgroud)

Express.js 解决方案

其他答案包括使用req.url// req.originalUrl/req.path的各种组合req.baseUrl。使用哪一种取决于上下文。如果您在app.METHOD函数中或者从中间件或嵌套路由器内部访问这些属性,这些属性的行为会有所不同。

概括:

  • usingreq.originalUrl应该是最通用的,但是你需要自己解析路径名(见上文)。
  • 使用req.path是最简单的,但您必须确保您不在中间件/嵌套路由器中。

当你在函数内部时app.METHOD

// GET 'http://example.com/admin/new?foo=bar'
app.get('/admin/new', (req, res) => {
    console.dir(req.originalUrl); // '/admin/new?foo=bar'
    console.dir(req.url); // '/admin/new?foo=bar
    console.dir(req.baseUrl); // ''
    console.dir(req.path); // '/admin/new'
    return res.status(200).send('All engines running!');
});
Run Code Online (Sandbox Code Playgroud)

当您位于中间件(或嵌套路由器)内部时:

// GET 'http://example.com/admin/new?foo=bar'
app.use('/admin', (req, res, next) => {
    console.dir(req.originalUrl); // '/admin/new?foo=bar'
    console.dir(req.url); // '/new?foo=bar'
    console.dir(req.baseUrl); // '/admin'
    console.dir(req.path); // '/new'
    next();
});
Run Code Online (Sandbox Code Playgroud)


Der*_*ike 8

使用req.path

如果您的端点是http://<your-domain>.com/hello/there?name=john...

那么req.path=/hello/there


文档: https: //expressjs.com/en/api.html#req.path


Ale*_*hiy 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);

}
Run Code Online (Sandbox Code Playgroud)


Sam*_*amT 4

完整的 url 存储在req.url您的案例中,使用 node.js 的url.parse()提取部分。获取路径并发送 Location 标头,用于res.set()重定向到不带查询字符串的 URL。

var url = require('url');
res.set('Location', url.parse(req.url).pathname);
Run Code Online (Sandbox Code Playgroud)