有很多方法可以使用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);
如果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);
正如我所说,这取决于你的框架