【问题标题】:modifying res object in express.js修改 express.js 中的 res 对象
【发布时间】:2015-03-19 03:30:01
【问题描述】:

我对我的 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 或类似的东西。(也可以减少混淆!)

【问题讨论】:

  • 我认为它是全球性的。如果您不确定,您可以放置​​一个日志(例如 console.log 或其他)并检查它。
  • res 是一种对象的一个​​实例。您只修改了一个实例。 node.js 可以轻松地同时处理多个请求/响应,每个请求/响应都有自己的res 对象。
  • 你完全可以做到这一点——这不像你在修改原型。但真正的问题是你为什么要这样做。特别是考虑到如果您将对象或数组传递给 res.send,它会自动运行,就像您调用 res.json 一样。阅读文档。 expressjs.com/4x/api.html#res.send
  • 另外,你的最后一句话表明你对 Node.js 中发生的事情有一个根本的误解。如果您实际上确实修改了对象的原型(这是您在谈论全局修改它时试图传达的内容),那么当您检查它时并不重要(假设节点没有循环) - 原型仍然会改变.
  • 我猜实际用例是将其切换为 res.render 如果 url 不以 "/api/" 开头,或者其他一些函数来获取正确的视图。我想这个方法的有趣部分真的是我的例子的 else 块中可能出现的内容。但是,是的,记录一些东西来提醒开发人员正在发生的事情可能是个好主意,这有点“开箱即用”,但这也是设计的重点!

标签: javascript node.js express middleware


【解决方案1】:

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

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

2) 阅读the documentation 将在这里得到回报。 res.sendres.json 的操作相同,如果它被传递一个对象或数组。也就是说,在典型情况下,您的其余代码的运行与您没有使用res.send() 的情况没有什么不同,但几个月或几年后会混淆某人(也许是您)。

【讨论】:

  • 想评论res.json() 也内部调用res.end(),而res.send() 没有。
  • 没错。但是,如果使用对象或数组调用 res.send() 调用 res.json() (调用 res.end()),我不确定你在做什么。就像我说的 - 如果传递一个对象或数组,它的操作是一样的。 github.com/strongloop/express/blob/master/lib/response.js#L134
  • 啊,我明白了,我不知道这个事实。
【解决方案2】:

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

这是我做的测试:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2015-12-20
    • 2016-08-13
    • 2013-05-17
    • 2011-07-22
    相关资源
    最近更新 更多