2015-03-19 113 views
0

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

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

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.send我的控制器可能会担心获取数据并发送它,res.send已经知道是否需要涉及某些渲染。虽然res.send虽然真的有用,但我可能会修改res以res.answer或类似的方式(使得更少混淆!)

+0

我认为这是全球性的。如果你不确定它,你可以把一个日志(前console.log或其他),并检查它。 – 2015-03-19 03:41:44

+0

'res'是一种对象类型的一个实例。你只修改那个实例。 node.js可以很容易地使用自己的'res'对象一次播放多个请求/响应。 – jfriend00 2015-03-19 03:49:40

+0

你可以完全做到这一点 - 它不像你修改原型。但真正的问题是为什么你想这样做。特别是如果你将一个对象或数组传递给res.send,它会自动运行,就像你调用res.json一样。阅读文档。 http://expressjs.com/4x/api.html#res.send – 2015-03-19 04:48:31

回答

1

我决定让这个答案,因为有时未来的读者不读评论。

1)您可以修改res及其会员以了解您的内容。您正在使用响应实例,而不是其原型。没有“全球”资源,但它确实有一个原型。

2)读the documentation将在这里还清。如果它传递了一个对象或数组,则res.send的操作与res.json相同。也就是说,在典型情况下,其他代码的运行方式与如果您没有与res.send()猴子相同,但会在几个月或几年后混淆某人(也许是您)。

+0

想要评论'res.json()'也可以在内部调用'res.end()',而'res.send()'不会。 – juunas 2015-03-19 05:08:40

+0

这是正确的。然而,如果用res.send()调用'res.json()'(调用'res.end()'),如果用一个对象或数组调用,我不确定你在驱动什么。就像我说的 - 如果传递一个对象或数组,它的运行方式是一样的。 https://github.com/strongloop/express/blob/master/lib/response.js#L134 – 2015-03-19 05:44:46

+0

啊,我明白了,我并不知道这个事实。 – juunas 2015-03-19 05:56:02

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