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调用的任何函数对请求对象所做的更改置之不理。好的,我已经编辑了,但是您添加了注释。我真的很抱歉,但我不知道你想达到什么目的