【问题标题】:How to get the unparsed query string from a http request in Express如何从 Express 中的 http 请求中获取未解析的查询字符串
【发布时间】:2012-05-25 12:25:11
【问题描述】:

我可以使用下面的来获取查询字符串。

  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' }

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    您可以按照this 示例使用nodeURL 模块:

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

    例如

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

    或者直接转到?之后的网址和substr

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

    (这就是 require('url').parse() 在幕后所做的)

    【讨论】:

    • 如何获取原始数据? request.query == { tt: 'gg' }。我想要 tt=gg。
    • 答案就是这样。您可能要注意上面的query 不是request.query。后者是express添加的成员。
    • 我不使用快递。我需要轻量级
    • 抱歉,在这种情况下,您需要添加更多代码,因为query 不是核心节点库中request 对象的成员。这就是为什么我认为你正在使用快递。无论如何,答案只是使用核心节点模块。
    • 现在使用parse 方法是discouraged。如果您不确定reg.url 是绝对的还是相对的,请改用new URL(req.url).searchnew URL(req.url, 'https://yourbasehere.com/').search。见:nodejs.org/dist/latest-v14.x/docs/api/url.html#url_url_search
    【解决方案2】:

    您可以在 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 ''
    

    请注意,如果您有a # to denote the end of the query,它将无法被识别。

    如果你想将字符串传递给一个新的 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'
    

    【讨论】:

    • req.url.split('?')[1] 对于包含多个 ? 符号的 有效 URL 将无法正常工作。
    • 该死的,你是对的!但是最后一个? 总是会成为查询的开始,对吧?让我快点解决这个问题……
    • 不,the first ? always marks the start of the query。所以我会切换到indexOf()
    【解决方案3】:

    Express 使用parseurl_parsedUrl 存储在request 对象中。原string query可以通过request._parsedUrl.query访问。

    【讨论】:

    • req.parsedUrl 不是已记录的 Express API 的一部分,因此在未来的版本中可能会发生更改并破坏您的代码。
    【解决方案4】:
    var queryString = Object.keys(request.query).map(key => key + '=' + request.query[key]).join('&');
    

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

    【讨论】:

    • 第一种方法可能会导致安全问题,因为您不转义字符。您至少应该encodeURIComponent(...) 键和值。此外,它不适用于在查询字符串中传递的数组和对象。但是第二个选项是安全的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2021-09-01
    • 1970-01-01
    • 2022-11-30
    • 2013-09-29
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多