【问题标题】:How to implement a middleware using object oriented design pattern in node.js?如何在 node.js 中使用面向对象的设计模式实现中间件?
【发布时间】:2020-11-21 05:40:07
【问题描述】:

我是面向对象设计模式的新手。
我只想转换我的 **middleware** 函数和 **models** 以遵循面向对象的设计模式并在我的代码中使用它。那么如何实现呢?

//示例中间件

const isActivated = async (req, res, next) => {
  const { email } = req.body
  try {
    const user = await User.findOne({ email: email })
    if (!user) {
      next(new Error('No such user is found!'))
    }
    if (!user.isActivated) {
      next(new Error('Please activate the account!'))
    }
  } catch (Error) {
    return res.status(HttpStatus.BAD_REQUEST).json({ Error })
  }
}

module.exports = isActivated

我的意思是说我们有一些代码可以连接到 mongo,如下所示:

const mongoose = require('mongoose');
module.exports = {
mongoose.Promise = global.Promise
    mongoose.set('useNewUrlParser', true)
    mongoose.set('useFindAndModify', false)
    mongoose.set('useCreateIndex', true)
    mongoose.set('useUnifiedTopology', true)
    mongoose.connect(process.env.URL)
      .then(() => {
        console.log('mongodb connection successful')
      })
      .catch((err) => {
        console.log('mongodb connection error', err)
      })
}

因此,如果我们想将其转换为遵循面向对象的设计模式,则必须将 mongoose 连接 转换为 singleton类,以便只能创建一次实例。同样,我只想知道如何按照一些设计patterns来实现middleware

mongo connect 的单例类(示例)

const mongoose = require('mongoose')
class Connection {
  constructor () {
    console.log('DATABSE_URL ', process.env.DATABASE_URL)
    this.url = `${process.env.DATABASE_URL}`
  }

  connect () {
    mongoose.Promise = global.Promise
    mongoose.set('useNewUrlParser', true)
    mongoose.set('useFindAndModify', false)
    mongoose.set('useCreateIndex', true)
    mongoose.set('useUnifiedTopology', true)
    mongoose.connect(this.url)
      .then(() => {
        console.log('mongodb connection successful')
      })
      .catch((err) => {
        console.log('mongodb connection error', err)
      })
  }
}

// SINGLETON CLASS
class Singleton {
  constructor () {
    if (!Singleton.instance) {
      Singleton.instance = new Connection()
    }
  }

  getInstance () {
    return Singleton.instance
  }
}
module.exports = Singleton

【问题讨论】:

  • 我不确定你在问什么。 “面向对象”意味着什么?不相关但在您刚刚检查“!用户”之后再次检查“用户”是多余的。
  • 嗨@DaveNewton 是的,我明白了你的意思,我已经用一个例子更新了这个问题。请再检查一遍好吗?
  • 为什么你想这样做?它提供什么好处?仅仅因为某些东西可以被写成一个类并不意味着它应该。了解为什么是理解如何的第一步。
  • 嘿,@DaveNewton 我是设计模式的新手。但是我在转换猫鼬连接部分后观察到的一个好处是它不会创建多个连接实例。这就是我在实现连接单例类后得到的好处。但我不确定在中间件中使用设计模式。那么你对中间件有什么建议呢??
  • 一个函数,就像你有的一样。

标签: node.js mongodb express oop design-patterns


【解决方案1】:

如果您想将该类用作其他模块中的单个实例,请尝试: module.exports = new Connection();

【讨论】:

  • 是的,但这不是我所问问题的解决方案。我要求将中间件转换为使用面向对象的设计模式
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2013-04-02
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多