如何在Express中从HTTP请求获取未解析的查询字符串

40
我可以使用以下代码来获取查询字符串。
  var query_string = request.query;

我需要的是原始未解析的查询字符串。我该如何获取? 对于以下的URL,查询字符串是{ tt: 'gg' },我需要tt=gg&hh=jj等等...

http://127.0.0.1:8065?tt=gg

Server running at http://127.0.0.1:8065
{ tt: 'gg' }
4个回答

50

你可以按照这个示例使用nodeURL 模块:

require('url').parse(request.url).query

例如。

node> require('url').parse('?tt=gg').query
'tt=gg'

或者直接访问URL,在?后使用substr函数截取字符串


var i = request.url.indexOf('?');
var query = request.url.substr(i+1);

(这是require('url').parse()在后台执行的操作)


1
如何获取原始数据?request.query == { tt: 'gg' }。我想要tt=gg。 - Tampa
1
这就是答案的作用。你可能需要注意上面的 query 不是 request.query。后者是由 express 添加的成员。 - Pero P.
我不使用Express。我需要轻量级的。 - Tampa
3
现在不建议使用parse方法。请改用new URL(req.url).search,或者如果你不确定req.url是绝对路径还是相对路径,请使用new URL(req.url, 'https://yourbasehere.com/').search。详情请参见: https://nodejs.org/dist/latest-v14.x/docs/api/url.html#url_url_search - Chris Bartley
对于安全问题,您可以像这样传递选项:require('url').parse(request.url, true).query - Athachai
显示剩余2条评论

7
你可以在express 3.x+中使用req.originalUrl。(旧版本可以使用node的http模块中的req.url)。这将生成原始字符串,不包括?:
var query_index = req.originalUrl.indexOf('?');
var query_string = (query_index>=0)?req.originalUrl.slice(query_index+1):'';
// 'tt=gg&hh=jj' or ''

请注意,如果您使用#表示查询结束, 它将不会被识别。
如果您想将字符串传递给新的URL,请包含?:
var query_index = req.originalUrl.indexOf('?');
var query_string = (query_index>=0)?req.originalUrl.slice(query_index):'';
// '&tt=gg&hh=jj' or ''
res.redirect('/new-route'+query_string);
// redirects to '/newroute?tt=gg&hh=jj'

1
req.url.split('?')[1] 对于包含多个 ? 符号的 有效 URL,将无法正常工作。 - Alexander Gonchiy
天啊,你说得对!但是最后一个 ? 总是查询的开始,对吧?让我马上修复一下... - ki9
1
不是的,第一个 ? 总是标记查询的开始。所以我会切换到 indexOf() - ki9

2
var queryString = Object.keys(request.query).map(key => key + '=' + request.query[key]).join('&');

或者

var queryString = require('querystring').stringify(request.query);

第一种方法可能会导致安全问题,因为您没有转义字符。您至少应该对键和值都使用encodeURIComponent(...)。此外,它不适用于在查询字符串中传递的数组和对象。但是第二个选项是安全的 :) - Edgar P-Yan

2

4
req.parsedUrl 不是 Express API 中记录的一部分,因此在将来的版本中可能会更改,从而破坏你的代码。 - Mark Stosberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接