Optional options: SchemaManagerOptionsProtected Readonly mapProtected Readonly optionsReadonly type检查指定基本类型并返回值
-名称
-是否为数组
-输入值
-类型参数
-Optional format: boolean是否格式化
-创建Schema但不自动注册
-字段信息
-Optional name: stringSchema名称
-遍历类型
-迭代函数
-获取指定Schema
-名称
-注册Schema
-名称
-字段具体信息
-检查指定Schema并返回值
-名称
-输入值
-Generated using TypeDoc
Optional name: stringProtected Readonly fieldsProtected managerReadonly name从当前Schema获取所有字段为可选的新Schema
-从当前Schema获取仅包含指定字段的新Schema
-Rest ...fieldNames: string[]从当前Schema获取所有字段为必填的新Schema
-检查Schema并返回值
-Optional isArray: booleanGenerated using TypeDoc
Protected Readonly options类型信息
-检查参数是否合法
-输入值
-Optional params: any类型选项
-检查参数,如果参数默认开启格式化,则格式化 -检查流程: -1: 解析 parse -2: 检查 check -3?: 格式化 formatter
-输入的值
-Optional params: any类型选项
-Optional format: boolean是否格式化,如果为undefined则使用默认配置
-Generated using TypeDoc
Optional options: ValueTypeManagerOptionsProtected Readonly mapProtected Readonly options遍历类型
-迭代函数
-获取指定类型
-类型名称
-注册类型
-类型名称
-选项
-获取指定类型值
-类型名称
-输入值
-Optional params: any类型参数
-Optional format: boolean是否格式化
-Generated using TypeDoc
Easy rest api helper
-Private apiPrivate appPrivate configPrivate defineAPIPrivate docsPrivate errorPrivate errorPrivate forcePrivate groupPrivate groupsPrivate infoPrivate Optional mockPrivate registAPIPrivate schemaOptional sharePrivate testPrivate type错误列表
-获取私有变量信息
-类型列表
-测试实例
-类型列表
-设置全局 After Hook
-获取Schema检查实例
-Optional params: Record<string, any>Optional query: Record<string, any>Optional body: Record<string, any>设置全局 Before Hook
-绑定路由 +
Easy rest api helper
+错误列表
+获取私有变量信息
+Schema 管理器
+测试实例
+类型管理器
+注册文档生成组件
+获取API参数检查实例
+绑定路由 (加载顺序:beforeHooks -> apiCheckParams -> middlewares -> handler -> afterHooks )
-返回结果检查
-Generated using TypeDoc
获取Swagger信息
+创建 Schema 对象
+生成文档
+文档保存路径
+是否等待程序退出再保存
+初始化测试系统
+APP或者serve实例,用于init supertest
+测试文件路径
+输出文件路径
+获取参数检查实例
+获取Schema检查实例
+设置文档格式化函数
+设置文档格式化函数
+设置测试格式化函数
+API 参数检查
+Optionalparams: Record<string, unknown>Optionalquery: Record<string, unknown>Optionalbody: Record<string, unknown>Optionalheaders: Record<string, unknown>Generated using TypeDoc
Generated using TypeDoc
通过简单的方式构建一个优秀的 API 服务(基于 express、@leizm/web 等)。
-一个优秀的 API 必须要有优秀的文档、较完整的测试,同时便于开发部署与联调。在文档方面,最大的问题在于,随着 API 的发展需要找人同步更新文档。有个更好的方案是不脱离代码自更新文档。
-通过 ERest,你可以在定义 API 的同时,完成参数模型的定义、API格式的定义,同时生成便于写 API 测试的脚手架,像调用本地方法一样写 API 测试,并自动完成 API 文档的生成(包括示例数据),同时生成 Swagger、Postman、基于 axios 的 js-sdk(更多功能支持自定义)。
-使用 (generator-erest)[https://github.com/yourtion/node-generator-erest] 帮助你快速生成一个 API 项目框架。
-$ npm install erest --save
-
-$ npm install generator-erest -g
# Express
$ yo erest:express
# @leizm/web
$ yo erest:lei-web
-
-'use strict';
const API = require('erest').default;
// API info for document
const INFO = {
title: 'erest-demo',
description: 'Easy to write, easy to test, easy to generate document.',
version: new Date(),
host: 'http://127.0.0.1:3000',
basePath: '/api',
};
// API group info
const GROUPS = {
Index: '首页',
};
// Init API
const apiService = new API({
info: INFO,
groups: GROUPS,
});
apiService.api.get('/index')
.group('Index')
.title('Test api')
.register((req, res) => {
res.end('Hello, API Framework Index');
});
const express = require('express');
const app = express();
const router = new express.Router();
app.use('/api', router);
// bing express router
apiService.bindRouter(router, apiService.checkerExpress);
app.listen(3000, function () {
console.log('erest-demo listening started');
});
-
-Generated using TypeDoc
 + + + + + + +
+🚀 现代化的 TypeScript API 框架 - 通过简单的方式构建优秀的 API 服务
+基于 Express、@leizm/web 等主流框架,ERest 提供了一套完整的 API 开发解决方案。支持自动文档生成、类型安全验证、测试脚手架等功能,让 API 开发更加高效和可靠。
+🔷 TypeScript 原生支持 - 完整的类型推导和类型安全
+🔧 原生 Zod 集成 - 高性能的参数验证和类型推导
+📚 自动文档生成 - 支持 Swagger、Postman、Markdown 等多种格式
+🧪 测试脚手架 - 像调用本地方法一样编写 API 测试
+🔌 多框架支持 - 兼容 Express、Koa、@leizm/web 等主流框架
+📦 SDK 自动生成 - 自动生成基于 axios 的客户端 SDK
+🎯 零配置启动 - 开箱即用的开发体验
+语言: TypeScript 5.8+
+运行时: Node.js 18+
+验证库: Zod 4.0+
+支持框架: Express 4.x, Koa 3.x, @leizm/web 2.x
+构建工具: Vite, Biome
+测试框架: Vitest
+# npm
npm install erest
# yarn
yarn add erest
# pnpm
pnpm add erest
+
+
+使用 快速生成项目框架:
+npm install generator-erest -g
# Express 项目
yo erest:express
# @leizm/web 项目
yo erest:lei-web
+
+
+import ERest, { z } from 'erest';
import express from 'express';
// 创建 ERest 实例
const api = new ERest({
info: {
title: 'My API',
description: 'A powerful API built with ERest',
version: new Date(),
host: 'http://localhost:3000',
basePath: '/api',
},
groups: {
user: '用户管理',
post: '文章管理',
},
});
// 定义 API 接口
api.api.get('/users/:id')
.group('user')
.title('获取用户信息')
.params(z.object({
id: z.string().describe('用户ID'),
}))
.query(z.object({
include: z.string().optional().describe('包含的关联数据'),
}))
.register(async (req, res) => {
const { id } = req.params;
const { include } = req.query;
// 业务逻辑
const user = await getUserById(id, include);
res.json({ success: true, data: user });
});
// 绑定到 Express
const app = express();
const router = express.Router();
app.use('/api', router);
api.bindRouter(router, api.checkerExpress);
app.listen(3000, () => {
console.log('🚀 Server running on http://localhost:3000');
});
+
+
+import { z } from 'erest';
// 定义复杂的数据模型
const CreateUserSchema = z.object({
name: z.string().min(1).max(50),
email: z.string().email(),
age: z.number().int().min(18).max(120),
tags: z.array(z.string()).optional(),
profile: z.object({
bio: z.string().optional(),
avatar: z.string().url().optional(),
}).optional(),
});
api.api.post('/users')
.group('user')
.title('创建用户')
.body(CreateUserSchema)
.register(async (req, res) => {
// req.body 自动获得完整的类型推导
const userData = req.body; // 类型安全!
const user = await createUser(userData);
res.json({ success: true, data: user });
});
+
+
+// 生成多种格式的文档
api.docs.generateDocs({
swagger: './docs/swagger.json',
markdown: './docs/api.md',
postman: './docs/postman.json',
axios: './sdk/api-client.js',
});
+
+
+Optional descriptionOptional handlerOptional responseGenerated using TypeDoc
Optional beforeOptional bodyOptional descriptionOptional groupOptional handlerOptional headersOptional middlewaresOptional mockOptional paramsOptional queryOptional requiredOptional requiredOptional responseGenerated using TypeDoc
OptionalbeforeOptionalbodyOptionaldescriptionOptionalgroupOptionalhandlerOptionalheadersOptionalmiddlewaresOptionalmockOptionalparamsOptionalqueryOptionalrequiredOptionalrequiredOptionalresponseOptional mockOptional responseOptional responseGenerated using TypeDoc
OptionalbodyOptionalheadersOptionalmockOptionalparamsOptionalqueryOptionalresponseOptionalresponseAPI接口定义
-Readonly $apisReadonly deleteOptional docOptional docsOptional formatReadonly getReadonly patchReadonly postReadonly putGenerated using TypeDoc
API接口定义
+API定义
-Optional docsOptional forceOptional groupsOptional infoOptional internalOptional invalidOptional missingOptional pathGenerated using TypeDoc
API定义
+OptionaldocsOptionalforceOptionalgroupsOptionalinfoOptionalinternalOptionalinvalidOptionalmissingOptionalpathAPI基础信息
-Optional baseAPI默认位置
-Optional description项目描述(可以为 markdown 字符串)
-Optional host服务器host地址
-Optional title项目标题
-Optional version项目版本
-Generated using TypeDoc
API基础信息
+文档生成信息
-Optional all生成 all-in-one.md
-Optional axios生成 jssdk.js 基于(axios)
-Optional home生成 Home.md
-Optional index生成 Index.md
-Optional json生成 docs.json
-Optional markdown生成Markdown
-Optional postman生成 postman.json
-Optional swagger生成 swagger.json
-Optional wiki生成wiki
-Generated using TypeDoc
文档生成信息
+OptionalallOptionalaxios生成 jssdk.js 基于(axios)
+Optionalhome生成 Home.md
+Optionalindex生成 Index.md
+Optionaljson生成 docs.json
+Optionalmarkdown生成Markdown
+Optionalpostman生成 postman.json
+Optionalswagger生成 swagger.json
+Optionalwiki生成wiki
+Optional headersOptional inputOptional nameOptional outputOptional pathGenerated using TypeDoc
Generated using TypeDoc
组方法
-Readonly deleteReadonly getReadonly patchReadonly postReadonly putGenerated using TypeDoc
组方法
+Optional invalid错误的参数类型列表
-Optional invalid错误的参数列表
-如果失败,此项为出错信息
-Optional missing缺少的参数列表
-是否成功
-结果
-Generated using TypeDoc
Optional comment备注
-Optional default默认值
-Optional format是否格式化
-Optional params类型参数
-Optional required是否必须
-数据类型
-Generated using TypeDoc
Generated using TypeDoc
Optional code错误代码
-如果失败,则表示出错信息
-是否成功
-值
-Generated using TypeDoc
Generated using TypeDoc
Optional checker② 检查方法
-Optional p: anyOptional description说明信息
-Optional formatter③ 格式化方法
-③ 格式化方法
-Optional is是否为系统内置的类型
-Optional is是否默认自动格式化
-Optional is类型动态参数是否必须
-Optional nullable能否为 null
-Optional params类型动态参数检查器
-类型动态参数检查器
-Optional parser① 解析方法
-① 解析方法
-Optional swagger对应的swagger 文档的类型
-Optional ts对应的TypeScript类型
-Generated using TypeDoc
Optional abort如果为true则解析时遇到第一个错误即停止接续解析
-Optional typeGenerated using TypeDoc
Generated using TypeDoc
Generated using TypeDoc
Rest ...args: any[]Generated using TypeDoc
Generated using TypeDoc
@tuzhanai/value-type-manager
-Generated using TypeDoc
Generated using TypeDoc
Generated using TypeDoc
Schema方法
+Const 类型检查出错
-Generated using TypeDoc
Const 类型格式化出错
-Generated using TypeDoc
Const 类型解析出错
-Generated using TypeDoc
Const 未知错误
-Generated using TypeDoc
Const Generated using TypeDoc
ConstConstReadonlyAlpha: ZodStringReadonlyAlphaNumeric: ZodStringReadonlyany: ZodAnyReadonlyAny: ZodAnyReadonlyarray: ZodArray<ZodAny>ReadonlyArray: ZodArray<ZodAny>ReadonlyAscii: ZodStringReadonlyBase64: ZodStringReadonlyboolean: ZodUnion<ReadonlyBoolean: ZodUnion<Readonlydate: ZodUnion<readonly [ZodDate, ZodPipe<ZodString, ZodTransform<Date, string>>]>ReadonlyDate: ZodUnion<readonly [ZodDate, ZodPipe<ZodString, ZodTransform<Date, string>>]>ReadonlyDomain: ZodStringReadonlyemail: ZodStringReadonlyEmail: ZodStringReadonlyENUM: ZodEnum<{ placeholder: "placeholder" }>ReadonlyFloat: ZodUnion<readonly [ZodNumber, ZodPipe<ZodString, ZodTransform<number, string>>]>ReadonlyIntArray: ZodUnion<ReadonlyInteger: ZodUnion<readonly [ZodNumber, ZodPipe<ZodString, ZodTransform<number, string>>]>ReadonlyJSON: ZodAnyReadonlyJSONString: ZodStringReadonlyMongoIdString: ZodStringReadonlyNullableInteger: ZodNullable<ReadonlyNullableString: ZodNullable<ZodString>Readonlynumber: ZodUnion<readonly [ZodNumber, ZodPipe<ZodString, ZodTransform<number, string>>]>ReadonlyNumber: ZodUnion<readonly [ZodNumber, ZodPipe<ZodString, ZodTransform<number, string>>]>Readonlyobject: ZodObject<{}, $strip>ReadonlyObject: ZodAnyReadonlystring: ZodStringReadonlyString: ZodStringReadonlyStringArray: ZodUnion<ReadonlyTrimString: ZodPipe<ZodString, ZodTransform<string, string>>Readonlyurl: ZodStringReadonlyURL: ZodStringReadonlyuuid: ZodString
获取 abortEarly 选项
-