修改 express.js 中的 res 对象

modifying res object in express.js

我有为我的 SPA 网站设计后端的想法。我会实施它,以便以“/api/”开头的路由 return 仅 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 或类似的东西。(也可以减少混淆!)

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

这是我做的测试:

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

虽然我仍然不太清楚你为什么要这样做?当有人查看您的 API 路线并看到 res.send() 时,看起来会非常混乱,但效果却是 res.json。为什么不能在 API 路由函数中使用 res.json

我决定将此作为答案,因为有时未来的读者不会阅读评论。

1) 您可以根据自己的喜好修改res及其成员。您正在操作一个响应实例,而不是它的原型。没有 "global" 资源,但它有一个原型。

2) 阅读 the documentation 会有所收获。如果传递对象或数组,res.send 的操作与 res.json 相同。也就是说,在典型情况下,您的其余代码 运行 与您不使用 res.send() 没有什么不同,但会使某些人(也许是您)感到困惑几个月或几年后。