NodeJS构造不需要文件的自定义对象

时间:2018-07-31 01:20:30

标签: node.js class object instantiation

nodejs中是否有一种方法可以在其自己的文件中定义自定义对象类型,然后在代码库中的其他任何地方实例化它而无需在文件中进行要求?

例如,每次我在某处创建新地图时,都不必在地图定义中进行要求。我希望能够做到

var user = new User();

无需定义即可在任何地方

1 个答案:

答案 0 :(得分:0)

如果您不想到处都需要依赖,那么可以使用依赖注入。依赖注入是一种将依赖关系或公共信息从一个上下文传递到另一个上下文的模式。

依赖注入的功能是通过解决和/或初始化依赖关系将依赖关系本身解耦。在JavaScript中,closures可通过将其上下文锁定在创建它们的范围中来隐藏依赖项的配置/初始化详细信息。这意味着实现依赖关系的文件不需要关心如何初始化它(即配置),这也可能意味着它还需要更多的东西。

下面是一个示例,说明如何在一个文件中需要User,然后将其注入到单独的文件中,然后像在注入文件的文件中一样使用它。我选择使用Express Server和到路由器的依赖注入作为示例,因为使用Node.js的一个普遍原因是构建Web API。有关依赖关系注入的另一个示例,请参阅RisingStack Engineering的blog post(您需要向下滚动到“依赖关系注入”部分)。

该示例包含3个文件

  • lib/models/User.js
    • 这是注入我们的UserRouter
    • 的模块
  • /routes/user.js
    • 这是UserRouter,它返回一个接受models对象的函数,该对象包含UserRouter所需的所有模型。创建路由器后,将其返回以在Express Server中使用
  • server.js
    • 将负责将User模型注入UserRouter的Express Server,以便它可以在缓存中创建新用户。

lib / models / User

class User {
    constructor(name) {
        this.name = name
    }
}

module.exports = User

routes / user.js

const Router = require('express').Router

const UserRouter = models => {
    // Use Destructuring to get the User model from the models object passed into the Router
    // You can use regular ES5 for this as well: var User = models.User
    const {User} = models
    const router = new Router()

    const users = []

    // Return all users in cache
    router.get('/', (req, res) => res.status(200).json({users}))

    router.post('/', (req, res) => {
        const {name} = (req.body || {})
        if (!name) {
            return res.status(400).send('A User must have a name')
        }

        // Create the new User
        let newUser = new User(name)

        // add it to the users cache
        users.push(newUser)

        // return 201 CREATED and send the user as the message body
        return res.status(201).json(newUser)
    })

    // Return the router instance
    return router
}

module.exports = UserRouter

server.js

const express = require('express')
const port = process.env.PORT || 1337

// require our UserRouter 
const UserRouter = require('./routes/user')

// import the User model
const User = require('./lib/models/User')

// create an object called Models with the User now as a property
const Models = {User}

const server = express()

// Inject the Models directly into the UserRouter
server.use('/users', UserRouter(Models))

server.listen(port, () => console.log(`Listening on ${port}`))