2011-09-22 13 views
16

Próbuję zrobić kilka prostych stronicowania. W tym celu próbuję przeanalizować bieżący adres URL, a następnie utworzyć odsyłacze do tego samego zapytania, ale z parametrami zwiększanymi i zmniejszanymi o page.Node.js url.parse z powrotem do ciągu znaków

Próbowałem wykonać następujące czynności, ale produkuje to samo łącze, bez nowego parametru page.

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

documentation for the URL module zdaje się sugerować, że format jest to, czego potrzebuję, ale robię coś złego.

Wiem, że mogę iterować i budować ciąg ręcznie, ale miałem nadzieję, że istnieje istniejąca metoda do tego.

+0

Czy to jest CoffeeScript? –

+1

Tak. Przeformuuję ją na JS, aby uczynić ją bardziej standardową dla ludzi, którzy mogą pomóc. –

Odpowiedz

42

Jeśli spojrzeć na latest documentation, można zobaczyć, że url.format zachowuje się w następujący sposób:

  • search zostaną wykorzystane w miejsce query
  • query (Object; patrz ciągu kwerendy) będzie tylko być używane, jeśli nie ma numeru search.

A kiedy modyfikować query, search pozostaje bez zmian i wykorzystuje je. Tak, aby zmusić go do używania query, wystarczy usunąć search od obiektu:

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 

Upewnij się, że zawsze czytać najnowszą wersję dokumentacji, to pozwoli zaoszczędzić wiele kłopotów.

+0

To jest dobra odpowiedź, uważam, że każdy, kto go używa, nie użyje operatora delete, ponieważ jest powolny. –

+9

Podstawowy przykład przedwczesnej optymalizacji tamtej koleżanki –

+1

Nie poprosiłem cię o zmianę odpowiedzi, zostawiłem komentarz. _delete_ jest o 1000% wolniejsze od ustawienia na wartość null lub undefined i nie ma sensu w obiektach mimo to (co to jest nawet _mean_, aby usunąć właściwość obiektu, która nie ma sensu w projekcie OO). Moim zdaniem, ustawienie go na undefined sprawia, że ​​jeszcze bardziej sensowne, nadal ma właściwość, po prostu nie jest już zdefiniowane. –

2

Inna odpowiedź jest dobra, ale można również zrobić coś takiego. Moduł querystring służy do pracy z ciągami zapytań.

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

parts.query będzie obiektem, jeśli url.parse (..., true) jest wysyłane. http://nodejs.org/docs/v0.4.12/api/url.html#url.parse –

+1

masz rację. To zadziała, jeśli użyty zostanie url.parse (req.url), bez ostatniego parametru. – ampersand

3

Wydaje mi się, że to błąd w węźle. Możesz spróbować:

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

To nie jest błąd, to jest wyraźnie udokumentowane: http://nodejs.org/docs/latest/api/url.html –

+0

Jesteś prawda, ale czy nie jest to najnowsza wersja niestabilna? Sprawdziłem tylko dokumentację dla 0.4.12 –

+0

Rzeczywiście, ale dokumentacja poprawiła się, i na szczęście dla nas, w tym przypadku, jest zgodna ze starszymi wersjami. –

0

Prosty git za to. Aby wysuszyć kod i uzyskać zmienne adresu URL bez potrzeby wymagania ("URL") użyłem: https://gist.github.com/4542588

Spowoduje to zanalizowanie i przeniesienie zmiennych URL do zmiennej req.urlparams. Działa wcześnie w przepływie zadań, więc jest dostępny dla wszystkich ścieżek ExpressJ.

Powiązane problemy