gpt4 book ai didi

node.js - 在 Express.js 的中间件模块中向响应对象添加数据是否可以?

转载 作者:IT老高 更新时间:2023-10-28 23:02:01 25 4
gpt4 key购买 nike

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

然后,在我的 route ,我可以这样做:

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

终于在layout.jade中:

!{includeJShare()}

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

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

最佳答案

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

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

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

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

详情见

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

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

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

另请参阅:req.locals vs. res.locals vs. res.data vs. req.data vs. app.locals in Express middleware

关于node.js - 在 Express.js 的中间件模块中向响应对象添加数据是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11337402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com