2011-09-22 71 views
16

我想要做一些簡單的分頁。 爲此,我試圖解析當前的URL,然後生成指向相同查詢的鏈接,但是增加或減少了參數pageNode.js url.parse結果返回字符串

我已經嘗試了以下操作,但它會生成相同的鏈接,但不會生成新的page參數。

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

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

我知道我可以迭代和手動建立字符串,但我希望有一個現有的方法。

+0

那是CoffeeScript嗎? –

+1

是的。我會將它重新格式化爲JS,以使其更加標準,以供人們協助。 –

回答

42

如果你看一下latest documentation,你可以看到,url.format的行爲以下列方式:

  • search將在地方query
  • query的使用(對象;見查詢字符串)將只如果沒有search,可以使用。

當你修改querysearch保持不變,並使用它。太給力了使用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 

確保你常讀的最新版本的文件,這會節省你很多的麻煩。

+0

這是一個很好的答案,我會考慮使用它的任何人不使用刪除操作符,因爲它是_really_慢。 –

+9

提前優化的主要例子有好友 –

+1

我沒有要求你改變答案,我留下了評論。 _delete_比設置爲null或未定義慢1000%,並且在對象中毫無意義(它甚至可以刪除對象的屬性,這在OO設計中沒有意義)。在我看來,將其設置爲未定義使其更有意義,它仍然具有該屬性,但它不再被定義。 –

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); 
+1

parts.query將是一個對象url.parse(...,true)被髮送。 http://nodejs.org/docs/v0.4.12/api/url.html#url.parse –

+1

你是對的。這將工作,如果使用url.parse(req.url),沒有最後一個參數 – ampersand

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

它不是一個錯誤,它清楚地記錄:http://nodejs.org/docs/latest/api/url.html –

+0

你是對,但不是最新版本不穩定?我只檢查了文檔0.4.12 –

+0

事實上,但文檔已經改進,幸運的是,在這種情況下,與舊版本一致。 –

0

簡單的git爲此。幹掉代碼並獲取URL變量而不需要('url')我使用:https://gist.github.com/4542588

這將解析並將url變量移動到req.urlparams變量中。它在請求工作流程中儘早運行,因此適用於所有expressjs路徑。