修改express.js中的res对象

modifying res object in express.js

本文关键字:res 对象 中的 js express 修改      更新时间:2023-09-26

我有这个想法,为我的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或类似的。(也减少了混乱!)

我决定把它作为一个答案,因为有时未来的读者不会阅读评论。

1) 您可以随心所欲地修改res及其成员。您操作的是响应的实例,而不是它的原型。没有"全球"资源,但它确实有一个原型。

2) 阅读文档会在这里得到回报。如果向CCD_ 2传递对象或数组,则CCD_。也就是说,在典型的情况下,你的代码的其余部分运行方式与你没有使用res.send()没有什么不同,但几个月或几年后会让某人(也许是你)感到困惑。

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

这是我做的测试:

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

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