有许多方法可以使用supertest
和nock
之类的东西来模拟请求,但我要做的是能够创建虚假的请求对象,就好像请求是不同的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.path
,req.query
,req.url
,但我担心我可能会遗漏某些东西,而且似乎有人在那里一定已经解决了这个问题。
我需要此行为的原因是,对于CMS中的任何给定网址,可能会有多个草稿。每个草稿将具有不同的内容元素,但是那些单独的内容元素可以具有基于URL或查询参数的逻辑。因此,即使请求以/ render /?draft = 1& url = / foo / bar /进入,我希望内容元素处理器相信请求进入/ foo / bar /并且忘记了版本系统实际上处理了初始HTTP请求。
答案 0 :(得分:0)
不确定理解,但似乎是网址重写,因此使用中间件可以正常工作
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);
正如我所说,这取决于你的框架