Skip to content

Elysia插件

使用Elysia的插件

Mango基于Elysia所编写,可以直接使用Elysia的插件

ts
import {Elysia} from 'elysia'

const plugin = new Elysia().decorate('test', 123)

// 入口程序
const app = MongoCore.init({
  businessPath: 'src',
  controllerPath: 'modules',
  name: 'Mango elysia',
  version: '1.0.0',
  swagger: {}
})
  .use(plugin)
  .listen(8899)

返回的app就是一个Elysia实例,可以直接在这里使用Elysia的插件

类型提示

由于在框架内无法获取到MongoCore.init的类型,所以用户自己使用的插件无法使用Context获取到类型

TIP

针对这种情况Mango提供了一种解决方案

将Context从程序入口处生成

ts
// 根目录的入口文件
import {Elysia} from 'elysia'
import { InferContext } from 'elysia'

const plugin = new Elysia().decorate('test', 123)

// 入口程序
const app = MongoCore.init({
  businessPath: 'src',
  controllerPath: 'modules',
  name: 'Mango elysia',
  version: '1.0.0',
  swagger: {}
})
  .use(plugin)
  .listen(8899)

export type Context = InferContext<typeof app>


// 使用
import { t } from 'elysia'
import { Get, Post, Put, Delete, All, Option, Patch, Custom } from 'mango-core'
import type { Context } from '@/index.ts' // <<< 从入口处导入Context而不是在mango-types
import type { Merge } from 'mango-types'

const createPostType = t.Object({
  title: t.String(),
  content: t.String()
})

@Controller({ prefix: '/posts' })
export class PostController {

  @Post('/', {
    body: createPostType
  })
  createPost(ctx: Merge<Context, typeof createPostType.static>) {
    console.log(ctx.test) // <<< 就可以获取到插件中的类型了
    // 创建文章
  }
}