这段代码是一个 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()
  }
}

代码功能解释:

  1. loadService 函数:
  • 递归遍历服务目录,读取所有文件和文件夹。
  • 将每个文件/文件夹信息存储在一个对象中,并将其添加到 serviceMap 对象中。
  • 文件信息包含 isDir (是否为目录)、value (文件内容) 等属性。
  1. createProxy 函数:
  • 创建一个代理对象,用于在服务对象上获取服务方法。
  • 当访问服务对象上的某个属性时,代理会检查该属性是否存在。
  • 如果属性存在且不是目录,则返回一个新的代理对象,用于访问服务方法;
  • 如果属性存在且是目录,则递归调用 createProxy 函数,创建一个新的代理对象;
  • 如果属性不存在,则返回一个错误函数,指示服务不存在。
  1. module.exports 函数:
  • 将服务代理对象添加到应用程序对象中,以便在路由处理程序中使用。
  • 返回一个中间件函数,用于处理请求并传递到下一个中间件。

使用方式:

在路由处理程序中,可以使用 app.service 对象访问服务方法。例如:

router.get('/users', (req, res) => {
  const userService = app.service.user
  const users = userService.findAll()
  res.send(users)
})
Node.js 中间件:加载服务并创建服务代理

原文地址: https://www.cveoy.top/t/topic/nhy2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录