自定义API端点 Custom API Endpoints

有关如何在 Directus 中构建自定义 API 端点的指南。注册新的 API 路由,可用于无限扩展平台的核心功能。

扩展入口点

端点的入口点是扩展包的 src/ 文件夹中的 index 文件。 它导出一个注册函数来注册一个或多个自定义路由。 您的端点的每个路由都将是 /<extension-name> 的子路由。

扩展名 扩展名称通常是部署时放置扩展的文件夹的名称。

入口点示例:

js
export default (router) => {
  router.get('/', (req, res) => res.send('Hello, World!'))
}

或者,您可以导出配置对象以自定义根路由:

js
export default {
  id: 'greet',
  handler: (router) => {
    router.get('/', (req, res) => res.send('Hello, World!'))
    router.get('/intro', (req, res) => res.send('Nice to meet you.'))
    router.get('/goodbye', (req, res) => res.send('Goodbye!'))
  },
}

此端点的路由可在“/greet”、“/greet/intro”和“/greet/goodbye”中访问。

Available Options

  • id — 此端点的唯一键。 您的端点的每个路由都将是 /<id> 的子路由。
  • handler — 端点的注册处理函数。

Register Function

register 函数接收两个参数 routercontextrouter 是一个 Express 路由器实例。 context 是具有以下属性的对象:

  • services — 所有 API 内部服务。
  • exceptions — 可用于抛出“适当”错误的 API 异常对象。
  • database — 连接到当前数据库的 Knex 实例。
  • getSchema — 读取服务中使用的完整可用模式的异步函数
  • env — 解析的环境变量。
  • loggerPino 实例。
  • emitter事件发射器 可用于触发其他扩展的自定义事件的实例。

事件循环
使用发射器实现自定义事件时,请确保您永远不会直接或间接发射您的钩子当前正在处理的相同事件,因为这会导致无限循环!

Example: Recipes

js
export default (router, { services, exceptions }) => {
  const { ItemsService } = services
  const { ServiceUnavailableException } = exceptions

  router.get('/', (req, res, next) => {
    const recipeService = new ItemsService('recipes', { schema: req.schema, accountability: req.accountability })

    recipeService
      .readByQuery({ sort: ['name'], fields: ['*'] })
      .then(results => res.json(results))
      .catch((error) => {
        return next(new ServiceUnavailableException(error.message))
      })
  })
}