Можно ли добавить данные в объект ответа в модуль промежуточного программного обеспечения в Express.js?
Вот базовая настройка. Я пытаюсь создать простой компонент промежуточного программного обеспечения, который позволит мне легко передавать данные с моего маршрута непосредственно на мой javascript на стороне клиента. (Очень похож на Gon 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 на клиенте, которая создает точный JSON-объект, который был создан на стороне сервера.
Здесь вопрос; все работает так, как ожидалось, но будучи новым для Express и Node.js в целом, мне было просто любопытно, если привязка свойств к объекту ответа в порядке, или что-то не так с этим, что я просто пропускаю? По какой-то причине он не проходит мой "тест на запах", но я не уверен, почему.....
Ответы
Ответ 1
Это нормально. Именно так разработан JavaScript. Единственное, что вы должны быть осторожны, - это не случайно переопределить уже существующие свойства или переопределить другие. Чтобы быть более безопасным, вместо того, чтобы добавлять все непосредственно к объектам req/res, вы можете подумать о более глубоком уровне:
res.mydata={}
res.mydata.person= ...
Как это.
Ответ 2
Я знаю, что это старый поток, но есть еще что-то, что можно добавить в эту тему.
Экспресс имеет объект response.locals, который предназначен для этой цели - расширение ответа от промежуточного программного обеспечения, чтобы сделать его доступным для просмотра.
Вы можете добавить свойство непосредственно к объекту ответа, и, как указал @hasanyasin, как работает JavaScript. Но Express, точнее, особым образом предпочитает, чтобы мы это делали.
Это может быть новым в express 3.x, не уверен. Возможно, этого не было, когда задавали этот вопрос.
Подробнее см.
http://expressjs.com/en/api.html#res.locals
Существует также app.locals для объектов, которые не отличаются от запроса к запросу (или ответа на ответ, который я предполагаю).
http://expressjs.com/en/api.html#app.locals