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



有很多方法可以使用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,可以有多个草稿。每个草稿都有不同的内容元素,但这些单独的内容元素可能具有基于 URL 或查询参数的逻辑。因此,即使请求以/render/?draft=1&url=/foo/bar/的形式出现,我也希望内容元素处理器相信请求来自/foo/bar/并忽略实际处理初始 HTTP 请求的版本系统。

不确定理解,但似乎是 url 重写,所以使用中间件可以工作

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

等等

app.use(urlRewrite);

确保在正确的位置使用它(取决于您的服务器目标)因为我们在重写之前可能需要参数...如果重写,您可能需要它之后...

编辑在我的框架中:

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

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

相关内容

最新更新