这是基本设置.我正在尝试创建一个简单的中间件组件,它允许我轻松地将数据从我的路由直接传递到客户端的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
has*_*sin 12
这完全没问题.这就是JavaScript的设计方式.唯一要注意的是不要意外地覆盖已有的属性或被其他人覆盖.为了更安全,您可以考虑更深入地进行更深层次的操作,而不是将所有内容直接添加到req/res对象:
res.mydata={}
res.mydata.person= ...
Run Code Online (Sandbox Code Playgroud)
像那样.
| 归档时间: |
|
| 查看次数: |
20006 次 |
| 最近记录: |