修改express.js中的res对象

时间:2015-03-19 03:30:02

标签: javascript node.js express middleware

我对SPA网站的后端设计有这个想法。我会实现它,以便以“/ api /”开头的路由只返回JSON中的相关数据。所有其他路线都会导致整页加载。

现在我的想法是在中间件中这样做:

app.use(function(req, res, next() ){
  if(req.path.split("/")[0]=="api"){
     res.send = res.json;  
     //or other custom response-function, I see many possibilities here!
  }else{
  ...
  }
});
app.use(routes);

现在,我的问题是,这是全局修改res对象,还是只修改当前请求(res的这个实例)?我的理解只是当前的一个被修改,并且据我所知这是真的,但节点非常快,所以有点难以自己测试(一个人只能在一毫秒内刷新这么多标签!)任何人都知道当然?

编辑:很多回答我问题的人都问我为什么要这样做。关键是要抽象服务器对来自前端加载的客户端和需要整页的客户端的请求所做的操作。我也在考虑使用相同的方法添加加载部分模板的路径的可能性。通过修改res.send我的控制器可以担心获取数据并发送它,res.send已经知道是否需要进行一些渲染。第二个想法尽管res.send本身非常有用,但我可能会将res修改为res.answer或类似的东西。(也可以减少混淆!)

2 个答案:

答案 0 :(得分:1)

我决定回答这个问题,因为有时未来的读者不会阅读这些评论。

1)您可以将res及其成员修改为您心目中的内容。您正在操作响应实例,而不是其原型。没有"全球"资源,但确实有原型。

2)阅读the documentation将在此获得回报。 res.send如果传递了对象或数组,则与res.json的操作相同。也就是说,在典型的情况下,你的代码的其余部分与你没有与res.send()交配的情况没有什么不同,但是会在几个月之后将某人(可能是你)混淆不清几年后。

答案 1 :(得分:0)

我对此进行了测试,每次请求时,响应对象都具有原始发送功能而不是更改后的值。所以不,它不会在全球范围内改变它。

这是我做的测试:

app.use(function(req, res){
    console.log(res.send);
    res.send = 'a';
    console.log(res.send);
});

虽然我还不太确定你为什么要这样做?当有人查看您的API路线并看到res.send()时,似乎会感到非常困惑,但效果却是res.json。为什么不能在API路由功能中使用res.json