0

我对使用 express 的passportjs比较陌生,并且对我的应用程序架构的最佳实践有疑问。

首先,我希望用户能够执行以下操作:

  • 本地登录/注册(用户名、密码)
  • 谷歌 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 auth 的凭据。这样,实例与即将到期的会话一起。

但是,我不确定这是否是最好的也是唯一的方法。

因此,我的问题是:利用这些与用户相关的实例最合理的方法是什么?

我还可以考虑将这些实例保存在我的 mongodb(用户模式)中,然后手动删除它们。或者,我更喜欢处理状态客户端(例如JWT)。

先感谢您!

4

1 回答 1

0

我通常将我的实例存储在应用程序对象上(例如,app.db、app.io)。我也有一些直接导出类实例的模块,然后在需要时(在服务器启动期间)调用 module.initialize()。

于 2017-02-16T13:32:36.480 回答