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

问题描述 投票:0回答:1

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

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

var user = new User();

来自任何地方,无需定义。

node.js class object instantiation
1个回答
0
投票

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

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

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

该示例有3个文件

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

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}`))
© www.soinside.com 2019 - 2024. All rights reserved.