【发布时间】: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