Использование res.locals в файле модели node.js - PullRequest
0 голосов
/ 26 сентября 2018

В целом я не знаю, как и почему вы настраиваете приложение node.js и как работает какая-либо из функций app.use - учебники по нему не объясняют, почему что-то происходит.

В любом случае, у меня есть так настроены socket.io, res.locals и index.js в корневом файле app.js.

const sockets = require('./models/socket')(io)

app.use(function (req, res, next) {
    res.locals.user_id = req.session.user_id;
    next();
});

const routes = require('./routes/index');
app.use('/', routes);

Я бы хотел иметь возможностьДоступ к res.locals в модели socket.js, как я могу в index.js, найденном в папке маршрутов.

Я не могу догадаться, как это сделать.Если кто-нибудь сможет объяснить, как и почему я могу или не могу, это было бы бонусом.Спасибо!

1 Ответ

0 голосов
/ 26 сентября 2018

Добро пожаловать в Expressjs, есть несколько основ, которые вы, вероятно, должны изучить, прежде чем идти дальше, они помогут решить некоторые ваши проблемы.Я кратко объясню их, но я предлагаю вам продолжить исследование.Затем я отвечу на ваш актуальный вопрос в конце.

Middleware и app.use

Expressjs основан на идее, что все это просто "middleware".Промежуточное программное обеспечение - это функция, которая выполняется как часть цепочки запросов.Цепочка запросов - это, по сути, один клиентский запрос, который затем проходит через цепочку ряда функций промежуточного программного обеспечения, пока не достигнет конца цепочки, не завершится досрочно, возвращая ответ клиенту или ошибки.

Express middleware - это функция, которая принимает следующие три аргумента.

  • req (запрос) - представляет запрос, сделанный клиентом на ваш сервер.
  • res (ответ) - представляетответ, который вы вернете клиенту.
  • next - способ сообщить выражению, что ваша текущая функция промежуточного программного обеспечения выполнена, и теперь она должна вызвать следующий компонент промежуточного программного обеспечения.Это можно назвать пустым как next(); или с ошибкой next(new Error());.Если он называется пустым, он вызовет следующий кусок промежуточного программного обеспечения, если он вызван с ошибкой, то он вызовет первый фрагмент промежуточного программного обеспечения с ошибкой.Если next не вызывается в конце части промежуточного программного обеспечения, то запрос считается завершенным и объект ответа отправляется пользователю.

app.use - это способ установки промежуточного программного обеспечения.это означает, что он будет выполняться для каждого запроса (если next() либо не вызывается предыдущим компонентом промежуточного ПО по какой-либо причине, либо он вызывается с ошибкой).Это промежуточное ПО будет работать для любого типа HTTP-запроса (GET, POST, PUT, DELETE и т. Д.).

app.use может принимать несколько аргументов, важные для изучения новичкамиявляются: app.use(func) и app.use(path, func).Первый устанавливает «глобальное» промежуточное программное обеспечение, которое запускается независимо от того, какую конечную точку (URL-путь) запрашивает клиент, а второе (с определенным путем) запускается, только если этот конкретный путь будет достигнут.Т.е. app.use('/hello', (req, res, next) => { res.send('world'); }); вернет "world", когда будет достигнута конечная точка "/ hello", но не если клиент запросит "/ hi".Где, если app.use((req, res, next) => { res.send('world'); }); вернет "мир", когда вы достигнете любой конечной точки.

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

Еще одна вещь, которая поразит вас, - также может быть выполнено экспресс-приложение, сделанное со стандартом const app = express() .используется в качестве промежуточного программного обеспечения .Это означает, что вы можете создать несколько приложений Express, а затем смонтировать их с помощью app.use в одно приложение Express.Это довольно сложный процесс, но он позволяет вам делать действительно замечательные вещи с помощью Express.

Почему вы не можете получить доступ к res.locals в socket.io?(Реальный вопрос)

В вашем обработчике промежуточного программного обеспечения вы настраиваете свойство res.locals.use_id.Это происходит только с этим отдельным запросом, вы можете передать его, пока запрос жив, передав его в другие функции, но вне этого запроса он не существует.res буквально является объектом ответа, который сообщает Express, как реагировать на запрос клиентов, вы можете установить его свойства во время запроса, но как только этот HTTP-запрос закончится, он исчезнет.

Socket.io - это способобработки запросов веб-сокетов, а не стандартных запросов HTTP.Таким образом, в стандартном экспресс-HTTP-запросе вы не сможете передать соединение чему-либо с помощью socket.io, поскольку соединение представляет собой один недолговечный HTTP-запрос.Точно так же вы не сможете сделать то же самое иным способом.

Если вы хотите найти идентификатор пользователя в запросе socket.io, вам придется сделать это в запросе socket.io.сам по себе.

Прямо сейчас вы вводите часть промежуточного программного обеспечения для запроса Express.js, затем вы вызываете next (), который запускает следующий фрагмент промежуточного программного обеспечения Express, ни при каких условиях он не переходит в области Socket.io.Это часто путают учебники, потому что Socket.io может обрабатывать запросы через тот же порт, который прослушивает Express, но они не пересекаются.Поэтому вам нужно написать отдельное промежуточное ПО как для цепочек запросов Express.js, так и для цепочек запросов socket.io.Есть способы написания этого кода один раз, а затем написание адаптера для использования на обеих платформах, но это не то, что вы пытались сделать здесь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...