Создание Middleware Global vs local var - PullRequest
1 голос
/ 15 мая 2019

Во время моего исследования о том, как лучше обрабатывать глобально используемые данные, я нашел этот вопрос См. 2. Ответ

Поэтому я интегрировал этот подход в свою базу кода и столкнулся с проблемой,который я хотел бы обсудить.Надеюсь, что кто-то может помочь мне здесь.

Я создал новый файл middleware.js, содержащий почти тот же код, что и в ответе SO, только с небольшими изменениями:

const url = require('../db/url');

module.exports = {
           render: function (view) {
            return function (req, res, next) {
                res.render(view);
            }
        },

        globalLocals: function (req, res, next) {
          res.locals = { 
                title: "My Website's Title",
                pageTitle: "The Root Splash Page",
                author: "Cory Gross",
                description: "My app's description",
            };
            next();
        },

        index: async function (req, res, next) {
            res.locals = {
                index: "index2",
                loggedIn: req.user ? true : false,
                linkObj: await url.getAllUrl()
            };
            next();
        }
};

В моемapp.js Я включил файл и просто приказал своему приложению использовать globalLocals:

var middleware = require('./config/middleware');
app.use(middleware.globalLocals);

Впоследствии без каких-либо других изменений я интегрировал это в свой ejs template, и оно заработало:

<h1><%= title %></h1>

Отлично!

После того, как это было сделано, я немного поиграл с частью index своего промежуточного программного обеспечения, а также интегрировал ее через мой app.js, но другим способом,потому что я просто хочу сделать эти «индексные» переменные доступными для моего индексного маршрутизатора для четкого разделения !!

app.use("/", middleware.index, indexRouter);

Так что теперь я смог получить доступ к значениям, определенным в промежуточном программном обеспечениии использовать их в ejs.НО я больше не мог получить доступ к любому из globalLocals и не понимаю, ПОЧЕМУ?

Может кто-нибудь сказать мне, как я могу сохранить разделение, как описано выше, и получить доступ к обоим объектам в моем шаблоне ejs

1 Ответ

1 голос
/ 15 мая 2019

когда вы делаете это

res.locals = {
                // properties
            };

вы переопределяете предыдущие значения локальных пользователей из предыдущих вызовов промежуточного программного обеспечения (потому что вы создаете совершенно новый объект). Вам нужно расширить res.locals новыми значениями, а не создавать совершенно новый объект. Для этого используйте Object.assign () , который скопирует новые значения (второй параметр) в объект со старыми значениями (первый параметр) - имейте в виду, что если они названы одинаково, вы будет переопределять их!

globalLocals: function (req, res, next) {
  res.locals = Object.assign(res.locals, { 
        title: "My Website's Title",
        pageTitle: "The Root Splash Page",
        author: "Cory Gross",
        description: "My app's description",
    });
    next();
},

index: async function (req, res, next) {
    res.locals = Object.assign(res.locals, {
        index: "index2",
        loggedIn: req.user ? true : false,
        linkObj: await url.getAllUrl()
    });
    next();
}
...