【问题标题】:Node.js url.parse result back to stringNode.js url.parse 结果返回到字符串
【发布时间】:2011-11-22 23:00:01
【问题描述】:

我正在尝试做一些简单的分页。 为此,我正在尝试解析当前 URL,然后生成指向相同查询的链接,但 page 参数会递增和递减。

我已尝试执行以下操作,但它会生成相同的链接,但没有新的 page 参数。

var parts = url.parse(req.url, true);
parts.query['page'] = 25;
console.log("Link: ", url.format(parts));

documentation for the URL module 似乎表明 format 是我需要的,但我做错了。

我知道我可以手动迭代和构建字符串,但我希望有一个现有的方法。

【问题讨论】:

  • 是的。我会将其重新格式化为 JS 以使其更标准,以供人们提供帮助。

标签: url node.js


【解决方案1】:

如果您查看latest documentation,您可以看到url.format 的行为方式如下:

  • search 将用于代替 query
  • query(对象;参见查询字符串)仅在 search 不存在时使用。

当你修改query 时,search 保持不变并使用它。所以要强制它使用query,只需从对象中删除search:

var url = require("url");
var parts = url.parse("http://test.com?page=25&foo=bar", true);
parts.query.page++;
delete parts.search;
console.log(url.format(parts)); //http://test.com/?page=26&foo=bar

确保您始终阅读最新版本的文档,这将为您省去很多麻烦。

【讨论】:

  • 这是一个很好的答案,我会考虑任何使用它的人不使用删除运算符,因为它真的很慢。
  • 哥们那里过早优化的主要例子
  • 我没有要求你改变答案,我留下了评论。 delete 比设置为 null 或 undefined 慢 1000%,并且无论如何在对象中都没有意义(甚至 mean 删除对象的属性是什么意思,这在 OO 中没有意义设计)。在我看来,将其设置为 undefined 更有意义,它仍然具有属性,只是不再定义。
  • 抱歉,我不是故意要表现得咄咄逼人。你是对的,如果有人在做一些对速度至关重要的事情,他们可能不想使用delete。感谢您的评论。
  • 您始终可以将其设置为未定义。请注意,在这种情况下,设置为 null 会引发错误。另请注意, url 模块的文档很难阅读,而且奇怪的是没有示例。 ;) 注意 #3:请参阅 stackoverflow.com/questions/14967535/… 以了解“删除”与“将其分配给未定义”:)
【解决方案2】:

另一个答案很好,但你也可以这样做。 querystring 模块用于处理查询字符串。

var querystring = require('querystring');
var qs = querystring.parse(parts.query);
qs.page = 25;
parts.search = '?' + querystring.stringify(qs);
var newUrl = url.format(parts);

【讨论】:

【解决方案3】:

在我看来这是节点中的错误。你可以试试

// in requires
var url = require('url');
var qs = require('querystring');

// later
var parts = url.parse(req.url, true);
parts.query['page'] = 25;
parts.query = qs.stringify(parts.query);
console.log("Link: ", url.format(parts));

【讨论】:

  • 这不是一个错误,它有明确的记录:nodejs.org/docs/latest/api/url.html
  • 你说得对,但最新版本不是不稳定吗?我只检查了 0.4.12 的文档
  • 确实,但文档已经改进,幸运的是,在这种情况下,与旧版本保持一致。
  • Is 仍然是查询字符串或更改为 require('qs')
  • qs 如果你想要 visionmedia 的 query string parser, querystring 用于 nodejs 原生解析器。
【解决方案4】:

在不需要 require('url') 的情况下干出代码并获取 URL 变量,我使用了:

/* 
   Used the url module to parse and place the parameters into req.urlparams.
   Follows the same pattern used for swagger API path variables that load 
   into the req.params scope.

*/
  app.use(function(req, res, next) {
    var url = require('url');
    var queryURL = url.parse(req.url, true);
    req.urlparams = queryURL.query;
    next();
  });

var myID = req.urlparams.myID;

这将解析 url 变量并将其移动到 req.urlparams 变量中。它在请求工作流的早期运行,因此可用于所有 expressjs 路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多