创建快速请求对象,就好像它来自另一个URL

时间:2014-01-10 22:04:58

标签: javascript node.js express

有许多方法可以使用supertestnock之类的东西来模拟请求,但我要做的是能够创建虚假的请求对象,就好像请求是不同的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或查询参数的逻辑。因此,即使请求以/ render /?draft = 1& url = / foo / bar /进入,我希望内容元素处理器相信请求进入/ foo / bar /并且忘记了版本系统实际上处理了初始HTTP请求。

1 个答案:

答案 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);

正如我所说,这取决于你的框架