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
.
Tim*_*Tim 24
不要使用模块做类似的事情:
res.redirect( req.originalUrl.split("?").shift() );
Run Code Online (Sandbox Code Playgroud)
Jak*_*kul 10
> 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)
其他答案包括使用req.url
// req.originalUrl
/req.path
的各种组合req.baseUrl
。使用哪一种取决于上下文。如果您在app.METHOD
函数中或者从中间件或嵌套路由器内部访问这些属性,这些属性的行为会有所不同。
概括:
req.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)
使用req.path
如果您的端点是http://<your-domain>.com/hello/there?name=john
...
那么req.path
=/hello/there
文档: https: //expressjs.com/en/api.html#req.path
// 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)
完整的 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)
归档时间: |
|
查看次数: |
41184 次 |
最近记录: |