Mango 是一个轻量级、高性能的 Web 框架,在Elysia
的基础上进行的二次开发。它在既拥有智能类型提示的情况下又提供了一套完整的mvc开发方式
- 高性能:基于 Bun 的高效运行时,提供卓越的性能。
- 简单易用:直观的 API 设计,让开发者可以快速上手。
- 生态:基于Elysia改造而来,完全适配Elysia的插件、中间件、生态。
- 内置路由:灵活的路由系统,支持动态路由和中间件。
- TypeScript 支持:内置对 TypeScript 的支持,提升开发体验。
- 支持 WebSocket:轻松实现WebSocket功能。
- 支持 Cron:轻松实现定时任务功能。
bun add mango-core mango-types
以下是一个使用 Mango 构建基本 Web 服务器的示例:
import { Controller, Get} from 'mango-core'
import type { Context } from 'mango-types'
@Controller({
name: '测试模块',
prefix: '/test',
detail: {
description: '这是一段测试模块的备注',
tags: ['测试'],
},
})
export default class DemoController {
@Get('/test')
login(data: Context) {
return 'Hello Word!'
}
}
import { Controller, Get} from 'mango-core'
import type { Context } from 'mango-types'
@Controller({
name: '测试模块',
prefix: '/test',
detail: {
description: '这是一段测试模块的备注',
tags: ['测试'],
},
})
export default class DemoController {
@Get()
test(store: Context) {
}
}
Mango 提供了一个简单的路由系统,以下是一些常用的路由示例:
支持Get, Post, Put, Delete, All, Option, Patch, Custom请求
其中被All装饰会命中所有的请求
Custom装饰器则是自定义请求方法
import { Controller, Get, Post, Put, Delete, All, Option, Patch, Custom} from 'mango-core'
import type { Context } from 'mango-types'
@Controller({
name: '测试模块',
prefix: '/test',
detail: {
description: '这是一段测试模块的备注',
tags: ['测试'],
},
})
export default class DemoController {
@Get('/test')
test1(data: Context) {
return 'Hello Word!'
}
@Post('/test')
test2(data: Context) {
return 'Hello Word!'
}
}
基于
@elysiajs/cron
封装
import { Controller, Get, Cron} from 'mango-core'
import type { Context } from 'mango-types'
@Controller({
name: '测试模块',
prefix: '/test',
detail: {
description: '这是一段测试模块的备注',
tags: ['测试'],
},
})
export default class DemoController {
@Cron({
name: 'task1',
pattern: '*/20 * * * * *',
})
cronTask() {
console.log('任务1')
}
@Get('/stop/task')
stopTask({ stopCronTask }: Context) {
stopCronTask('task1')
return '停止任务1'
}
}
import { Controller, WebSocket} from 'mango-core'
import type { WebSocketContext } from 'mango-types'
@Controller({
name: '测试模块',
prefix: '/test',
detail: {
description: '这是一段测试模块的备注',
tags: ['测试'],
},
})
export default class DemoController {
@WebSocket('/ws', {
body: t.Object({
name: t.String(),
age: t.Number(),
}),
})
websocket(ws: WebSocketContext, message: any) {
ws.send(message)
}
}
注意,自定义装饰器必须在请求装饰器下面
import { Controller, Get, Post, Put, Delete, All, Option, Patch, Custom} from 'mango-core'
import type { Context } from 'mango-types'
import { createParameterDecorator } from 'mango-core'
import { HttpStatus, JsonResponse } from 'mango-utils'
const test = createParameterDecorator<{
body: any
}>((context) => {
if (!context.body.name) {
return JsonResponse(
{
code: HttpStatus.BAD_REQUEST,
msg: '缺少名字',
},
HttpStatus.BAD_REQUEST,
)
}
return true
})
@Controller({
name: '测试模块',
prefix: '/test',
detail: {
description: '这是一段测试模块的备注',
tags: ['测试'],
},
})
export default class DemoController {
@Post('/test')
@test
test1(data: Context) {
return 'Hello Word!'
}
}
欢迎贡献
该项目采用 MIT 许可证