Node.js 中间件:加载服务并创建服务代理
这段代码是一个 Node.js 服务器中的中间件,用于加载服务并创建服务代理。loadService 函数通过读取服务目录中的文件和文件夹,将它们转换为一个对象。createProxy 函数创建一个代理,用于在服务对象上获取服务方法。在代理中,如果请求的服务方法存在,则返回该方法的值,否则返回一个包含错误信息的函数。最后,将服务代理添加到应用程序对象中,以便在路由处理程序中使用。
const fs = require('fs')
const path = require('path')
const loadService = servicePath => {
const serviceMap = {}
const files = fs.readdirSync(servicePath)
files.forEach(file => {
const fileState = fs.statSync(path.join(servicePath, file))
if (fileState.isDirectory()) {
serviceMap[file] = {
isDir: true,
...loadService(path.join(servicePath, file))
}
} else {
const serviceName = file.substr(0, file.lastIndexOf('.'))
if (serviceName) {
serviceMap[serviceName] = {
isDir: false,
value: require(path.join(servicePath, file))
}
}
}
})
return serviceMap
}
const errMsg = message => ({ code: 1, message, data: null })
const createProxy = serviceMap => {
return new Proxy(serviceMap, {
get(target, name) {
if (target[name]) {
if (!target[name].isDir) {
return new Proxy(target[name], {
get(target, name) {
return target.value[name] ? target.value[name] : () => errMsg('service method not exist')
}
})
} else {
return createProxy(target[name])
}
} else {
return new Proxy({}, {
get() {
return () => errMsg('service not exist')
}
})
}
}
})
}
// load all service from service directory
const serviceMap = loadService(path.join(__dirname, '../service'))
module.exports = app => {
app.service = createProxy(serviceMap)
return (req, res, next) => {
next()
}
}
代码功能解释:
loadService函数:
- 递归遍历服务目录,读取所有文件和文件夹。
- 将每个文件/文件夹信息存储在一个对象中,并将其添加到
serviceMap对象中。 - 文件信息包含
isDir(是否为目录)、value(文件内容) 等属性。
createProxy函数:
- 创建一个代理对象,用于在服务对象上获取服务方法。
- 当访问服务对象上的某个属性时,代理会检查该属性是否存在。
- 如果属性存在且不是目录,则返回一个新的代理对象,用于访问服务方法;
- 如果属性存在且是目录,则递归调用
createProxy函数,创建一个新的代理对象; - 如果属性不存在,则返回一个错误函数,指示服务不存在。
module.exports函数:
- 将服务代理对象添加到应用程序对象中,以便在路由处理程序中使用。
- 返回一个中间件函数,用于处理请求并传递到下一个中间件。
使用方式:
在路由处理程序中,可以使用 app.service 对象访问服务方法。例如:
router.get('/users', (req, res) => {
const userService = app.service.user
const users = userService.findAll()
res.send(users)
})
原文地址: https://www.cveoy.top/t/topic/nhy2 著作权归作者所有。请勿转载和采集!