Node.js url.parse result обратно в строку

Я пытаюсь сделать простую разбивку на страницы. С этой целью я пытаюсь проанализировать текущий URL-адрес, а затем создать ссылки на один и тот же запрос, но с добавленными и уменьшенными параметрами page.

Я пробовал сделать следующее, но он создает ту же ссылку без нового параметра page.

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

Документация для модуля URL кажется, что format - это то, что мне нужно, но я делаю что-то неправильно.

Я знаю, что могу итерации и создавать строку вручную, но я надеялся, что существует существующий метод для этого.

Ответы

Ответ 1

Если вы посмотрите на последнюю документацию, вы увидите, что url.format ведет себя следующим образом:

  • search будет использоваться вместо query
  • query (object; see querystring) будет использоваться, только если 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

Убедитесь, что вы всегда читаете последнюю версию документации, это сэкономит вам массу проблем.

Ответ 2

Мне кажется, что это ошибка в node. Вы можете попробовать

// 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));

Ответ 3

Другой ответ хорош, но вы также можете сделать что-то подобное. Модуль querystring используется для работы с строками запроса.

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

Ответ 4

Чтобы высушить код и получить переменные 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.