将数据添加到Express.js中的中间件模块中的响应对象可以吗?

这是基本的设置。 我正在尝试创build一个简单的中间件组件,使我可以轻松地将数据从我的路由传递到客户端的JavaScript。 (非常类似ruby中的贡gem)。 我这样做的方式是有一个看起来像这样的模块:

module.exports = function(){ return function(req,res,next){ var app = req.app; if(typeof(app) == 'undefined'){ var err = new Error("The JShare module requires express"); next(err); return; } res.jshare = {}; app.dynamicHelpers({ includeJShare: function(req,res){ if(typeof(res.jshare) === 'undefined'){ return ""; } return function(){ return '<script type="text/javascript">window.jshare=' + JSON.stringify(res.jshare) + '</script>'; } } }); next(); }; } 

那么,在我的路线,我可以做到这一点:

 exports.index = function(req, res){ res.jshare.person = {firstName : "Alex"}; res.render('index', { title: 'Express' }) }; 

最后在layout.jade中:

 !{includeJShare()} 

所做的是在客户端输出一行javascript,创build服务器端创build的确切JSON对象。

这是一个问题。 这一切都按预期工作,但一般来说,Express和Node.js是新的,我只是好奇,如果将属性附加到响应对象是好的,或者有什么问题,我只是俯视? 由于某种原因,它不能通过我的“气味testing”,但我不知道为什么…..

这完全OK。 这是JavaScript的devise。 唯一需要注意的是不要无意中覆盖已经存在的属性或者被其他属性覆盖。 为了更安全,不要直接将所有内容添加到req / res对象,您可能会考虑更深入一些:

 res.mydata={} res.mydata.person= ... 

像那样。

我知道这是一个古老的线程,但还有其他的东西要添加到这个话题。

Express有一个response.locals对象,意思是为了这个目的 – 扩展中间件的响应,使其可以被视图使用。

您可以直接将属性添加到响应对象,正如@hasanyasin所指出的那样,是JavaScript的devise方式。 但是,更具体地说,快递公司更喜欢我们这样做。

这在express 3.x中可能是新的,不确定。 当这个问题被问到的时候也许不存在。

有关详情,请参阅

http://expressjs.com/en/api.html#res.locals

也有一个app.locals的对象不会因请求的不同而不同(或者我认为对响应的响应)。

http://expressjs.com/en/api.html#app.locals