Экземпляр класса магазина для пользователя ES6 Nodejs Express Passportjs

Я относительно новичок в passportjs с помощью Express, и у меня есть вопрос относительно лучших практик для архитектуры моего приложения.

Во-первых, я хочу, чтобы пользователь мог делать следующее:

  • Локальный вход/регистрация (имя пользователя, пароль)
  • Google OAuth

Во-вторых, я хочу повторно использовать экземпляр класса ES6 всякий раз, когда пользователь делает вызов.

Пример:

Класс

class ImapConnector { 

  constructor(options) {
     this.options = options;
     this.imap = new IPromise(options);
  }

  connect() {
     return this.imap.connectAsync();
  }

  getBoxes() {
     return this.connect().then(() => new Promise((resolve, reject) => {
        this.imap.getBoxes((err, boxes) => {
           err ? reject() : resolve(boxes);
        });
     }));
  }

}

Контроллер

function getBoxes(req, res) {
   const options = {
      user: req.user.email,
      password: req.user.password,
      host: req.user.email.host,
      port: req.user.email.port,
      tls: true,
      mailbox: 'INBOX'
   };
   const imapConnector = new ImapConnector(options);
   imapConnector.getBoxes().then((boxes) => {
      res.status(200).send(boxes);
   });
}

Как видите, вызов из контроллера в настоящее время создает экземпляр класса ImapConnector, который используется только внутри области действия функции контроллера. Очевидно, очень расточительный подход к памяти.

Теперь моя идея состоит в том, чтобы создать и сохранить экземпляр в сеансе экспресс-пользователя, поскольку экземпляр привязан к параметрам пользователя, таким как учетные данные для аутентификации imap. Таким образом, экземпляр находится вместе с истекающим сеансом.

Однако я не уверен, что это лучший и единственный способ.

Таким образом, у меня возникает вопрос: Каков наиболее разумный подход к использованию таких экземпляров, связанных с пользователем?

Я также мог бы подумать о сохранении этих экземпляров в моем mongodb (пользовательская схема), а затем удалить их вручную. При желании я бы предпочел обрабатывать состояние на стороне клиента (например, JWT).

Заранее спасибо!


person DEls    schedule 14.11.2016    source источник
comment
какой у Вас вопрос?   -  person Naeem Shaikh    schedule 15.11.2016
comment
извините, @NaeemShaikh, может быть, я был неточен: каков наиболее разумный подход к использованию экземпляров, связанных с пользователем, в среде экспресс / узел / паспорт?   -  person DEls    schedule 16.11.2016
comment
Я бы сохранил все параметры внутри сеанса и создавал новый ImapConnector для каждого запроса.   -  person Naeem Shaikh    schedule 16.11.2016


Ответы (1)


Я обычно храню свои экземпляры в объекте приложения (например, app.db, app.io). У меня также есть несколько модулей, которые напрямую экспортируют экземпляр класса, а затем при необходимости я вызываю module.initialize() (во время запуска сервера).

person mathieug    schedule 16.02.2017