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

BFr*_*ree 15 node.js express

这是基本设置.我正在尝试创建一个简单的中间件组件,它允许我轻松地将数据从我的路由直接传递到客户端的javascript.(非常类似于红宝石中的Gon宝石).我这样做的方法是使用一个如下所示的模块:

    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();
    };
}
Run Code Online (Sandbox Code Playgroud)

然后,在我的路线中,我可以这样做:

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

最后在layout.jade中:

!{includeJShare()}
Run Code Online (Sandbox Code Playgroud)

这样做是在客户端上输出一行javascript,创建服务器端创建的确切JSON对象.

这是问题; 这一切都按预期工作,但一般来说是Express和Node.js的新手,我只是好奇,如果将属性附加到响应对象上是好的,或者这样做有什么问题我只是忽略了?由于某种原因,它没有通过我的"气味测试",但我不知道为什么.....

Bra*_*don 36

我知道这是一个旧线程,但还有其他东西可以添加到这个主题.

Express有一个response.locals对象,用于此目的 - 扩展中间件的响应,使其可用于视图.

您可以直接向响应对象添加属性,并且@hasanyasin指出,是JavaScript的设计方式.但更具体地说,Express有一种特殊的方式,他们更喜欢我们这样做.

这可能是快递3.x中的新内容,不确定.当问到这个问题时,也许它不存在.

有关详情,请参阅

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

还有一个app.locals用于对象,这些对象不会因请求(或我想到的响应的响应)而变化.

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

  • Express团队更改了他们的网站URL模式以包含区域设置代码.我已经更新了这个答案中的链接,使用"en",它可以正常工作. (2认同)
  • 在我看来,这里的模式应该是“与请求相关的东西,要交给稍后的中间件附加到‘req’,而注定要格式化/与响应一起发回的东西属于‘res.locals’ . (2认同)

has*_*sin 12

这完全没问题.这就是JavaScript的设计方式.唯一要注意的是不要意外地覆盖已有的属性或被其他人覆盖.为了更安全,您可以考虑更深入地进行更深层次的操作,而不是将所有内容直接添加到req/res对象:

res.mydata={}
res.mydata.person= ...
Run Code Online (Sandbox Code Playgroud)

像那样.

  • [res.locals](http://expressjs.com/4x/api.html#res.locals) 是存储这些类型数据的合乎逻辑的地方吗? (2认同)
  • 仅仅因为 JS 允许这种事情并不意味着你应该这样做。切勿像这样向库对象添加随机属性。如果 Express 的未来版本开始使用 `res.mydata` 属性怎么办?在该示例中不太可能,但这只是“mydata”——您的属性可能不是那么做作。升级后您的应用程序将会损坏。最好的情况是,从可读性的角度来看,这是令人困惑的——我组成了哪些键,哪些是库函数?使用 [`res.locals`](http://expressjs.com/en/4x/api.html),Express 明确为此目的提供的对象,如上所述。 (2认同)