【问题标题】:NodeJS Construct a custom object without requiring the fileNodeJS 构造自定义对象而不需要文件
【发布时间】:2019-01-07 07:27:17
【问题描述】:

nodejs 有没有办法在它自己的文件中定义自定义对象类型,然后在代码库中的任何其他地方实例化它而不需要在文件中使用?

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

var user = new User();

从任何地方都不需要在定义中。

【问题讨论】:

  • 如果您要遵循 node.js 模块化约定,其中每个模块独立存在并且没有隐藏的依赖关系或它所依赖的某些全局环境,则不会。只需 require() 模块中的 User 在任何您要使用它的地方。这就是你如何充分利用模块、重用、可测试性、显式依赖等......只需在 node.js 中习惯它。如果你要使用它,require()它!

标签: node.js class object instantiation


【解决方案1】:

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

依赖注入的强大之处在于将依赖本身与解析和/或初始化该依赖解耦。在 JavaScript 中,closures 可用于隐藏依赖项的配置/初始化细节,方法是将其上下文锁定到创建它们的范围。这意味着实现依赖关系的文件不需要关心如何初始化它(即配置),这可能也意味着它需要更多的东西。

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

例子有3个文件

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

lib/models/用户

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

module.exports = User

路由/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}`))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2019-01-15
    • 2014-08-04
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多