Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 创建express请求对象,就像它来自另一个URL一样_Javascript_Node.js_Express - Fatal编程技术网

Javascript 创建express请求对象,就像它来自另一个URL一样

Javascript 创建express请求对象,就像它来自另一个URL一样,javascript,node.js,express,Javascript,Node.js,Express,有很多方法可以使用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

有很多方法可以使用
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,都可能有多个草稿。每个草稿都有不同的内容元素,但这些单独的内容元素可能有基于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);
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);
如果urlRewrite依赖于urlParams,我可以编写

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

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

如果我只更改
req.url
,那么
req.query.foo
将不会正确更新,除非req.url中有我不知道的魔法,它会导致在修改时设置其他属性。另外,我不寻求严格重写,因为我仍然希望/render处理程序接收请求并返回响应。我只想让/render调用的任何函数对请求对象所做的更改置之不理。好的,我已经编辑了,但是您添加了注释。我真的很抱歉,但我不知道你想达到什么目的