nodejs中是否有一种方法可以在其自己的文件中定义自定义对象类型,然后在代码库中的其他任何地方实例化它而无需在文件中进行要求?
例如,每次我在某处创建新地图时,都不必在地图定义中进行要求。我希望能够做到
var user = new User();
无需定义即可在任何地方
答案 0 :(得分:0)
如果您不想到处都需要依赖,那么可以使用依赖注入。依赖注入是一种将依赖关系或公共信息从一个上下文传递到另一个上下文的模式。
依赖注入的功能是通过解决和/或初始化依赖关系将依赖关系本身解耦。在JavaScript中,closures可通过将其上下文锁定在创建它们的范围中来隐藏依赖项的配置/初始化详细信息。这意味着实现依赖关系的文件不需要关心如何初始化它(即配置),这也可能意味着它还需要更多的东西。
下面是一个示例,说明如何在一个文件中需要User
,然后将其注入到单独的文件中,然后像在注入文件的文件中一样使用它。我选择使用Express Server和到路由器的依赖注入作为示例,因为使用Node.js的一个普遍原因是构建Web API。有关依赖关系注入的另一个示例,请参阅RisingStack Engineering的blog post(您需要向下滚动到“依赖关系注入”部分)。
该示例包含3个文件
lib/models/User.js
UserRouter
/routes/user.js
models
对象的函数,该对象包含UserRouter
所需的所有模型。创建路由器后,将其返回以在Express Server中使用server.js
。
User
模型注入UserRouter
的Express Server,以便它可以在缓存中创建新用户。class User {
constructor(name) {
this.name = name
}
}
module.exports = User
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
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}`))