22

这是基本设置。我正在尝试创建一个简单的中间件组件,它可以让我轻松地将数据从路由直接传递到客户端的 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();
    };
}

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

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

最后在 layout.jade 中:

!{includeJShare()}

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

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

4

3 回答 3

40

我知道这是一个旧线程,但是这个主题还有其他内容要添加。

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

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

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

有关详细信息,请参阅

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

还有一个app.localsfor 对象不会因请求而异(或响应我想的响应)。

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

另请参阅:Express 中间件中的 req.locals vs. res.locals vs. res.data vs. req.data vs. app.locals

于 2013-03-12T20:35:36.953 回答
15

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

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

像那样。

于 2012-07-05T03:49:43.233 回答
-1

用于res.locals在响应对象中包含自定义变量。

于 2020-11-15T10:57:55.390 回答