2014-01-10 16 views
0

有很多方法可以使用像supertestnock這樣的東西來模擬請求,但是我要做的就是能夠創建假請求對象,就好像請求是去一個不同的URL,可以傳遞給其他處理函數。創建快速請求對象,就好像它來自另一個URL

app.get("/render", function(req, res) { 
    // how do I do this? 
    var fake = createFakeRequest("/bar/?baz=qux", req); 

    // I want doStuff to believe the request came to /bar/?baz=qux 
    doStuff(fake, function(err, result) { 
     res.send(result); 
    }); 
}); 

我知道我可以修改他的所有變量,如req.pathreq.queryreq.url,但我很擔心,我可能會錯過一些東西,好像有人在那裏一定已經解決了這個問題。

我需要這種行爲的原因是,對於我的CMS中的任何給定URL,可以有多個草稿。每個草稿將具有不同的內容元素,但這些單獨的內容元素可能具有基於URL或查詢參數的邏輯。因此,即使請求是作爲/ render /?draft = 1 & url =/foo/bar /,我希望內容元素處理器相信請求進入了/ foo/bar /並且不理會版本系統實際上處理了最初的HTTP請求。

回答

0

不知道理解,但似乎像URL重寫,所以使用中間件可以工作

function urlRewrite(req, res, next){ 
    req.url ="..."; 
    next(); 
} 

app.use(urlRewrite); 

一定要在合適的地方使用它(根據您的服務器目標) 原因我們可能需要params之前重寫...如果重寫,您可能需要它後...

編輯 在我的框架:

server.before(extractPath); 
server.before(urlParams); 
server.before(pathParams); 
server.get("/foo", route.foo); 

所以,我可以寫

server.before(extractPath); 
=> server.before(function(req, res, next){ 
    urlRewrite(req, res, function(){ 
     extractPath(req, res, next); 
    } 
}); 
server.before(urlParams); 
server.before(pathParams); 
server.get("/foo", route.foo); 

如果urlRewrite取決於urlParams,我可以寫

server.before(extractPath); 
server.before(urlParams); 
=> server.before(function(req, res, next){ 
    urlRewrite(req, res, function(){ 
     extractPath(req, res, function(){ 
      urlParams(req, res, next); 
     }); 
    }); 
}); 
server.before(pathParams); 
server.get("/foo", route.foo); 

正如我所說的,這取決於你的框架

+0

如果我只改變'req.url',那麼'req.query.foo'將不會被正確更新,除非我有魔法在req.url中不知道這會導致其他屬性在修改時被設置。此外,我並不尋求嚴格的重寫,因爲我仍然希望/渲染處理程序接收請求並返回響應。我只是想讓任何函數/提供的調用忘記對請求對象進行更改。 – Nucleon

+0

好的,我編輯過,但你添加了你的評論。我很抱歉,但我不知道你想達到什麼目的 – farvilain