Можно ли добавить данные в объект ответа в модуль промежуточного программного обеспечения в 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