跳到内容
当前位置:首页>考研真题>Nest(NestJS)基础复习 - 速通版 02

Nest(NestJS)基础复习 - 速通版 02

  • 2026-10-13 06:09:15
Nest(NestJS)基础复习 - 速通版 02
本篇主要介绍:
1)Nest 装饰器原理
2)核心流程:middleware、guard、pipe、controller、interceptor、exceptionFilter

1. Nest 装饰器原理

装饰器 =一个普通函数,在类定义的那一刻自动执行,接收被装饰的目标(类、方法、属性、参数),然后给它加标记、加元数据、或改它的行为。

1.1)类装饰器

@Decorator 只是语法糖,等价于"在类定义完后立刻调用 Decorator(Target)"。

类装饰器接收一个参数:类构造函数本身。

// ① 写一个装饰器函数function Component(target) {  console.log('装饰器执行了!收到的类是:', target.name);  target.__role = 'component';   // 给类加个静态属性(标记)}// ② 用 @ 挂到类上@Componentclass UserService {}// ③ 运行时输出:// 装饰器执行了!收到的类是:UserServiceconsole.log(UserService.__role);  // 'component'
  • @Component 在 class UserService 定义时就执行了,不是 new 的时候。

  • 它收到的 target 就是 UserService 这个类本身(构造函数)。

  • 可以在 target 上随便加属性——这就是"NestJS 靠装饰器存元数据"的原理

1.2)装饰器工厂:带参数的装饰器

@Controller('users') 里那个 'users' 是怎么传进去的?——装饰器外面再包一层函数。

// 装饰器工厂:外层函数接收参数,返回真正的装饰器函数function Controller(prefix) {  console.log('工厂被调用,prefix =', prefix);  // 返回真正的装饰器  return function(target) {    console.log('装饰器执行,给', target.name, '加路由前缀', prefix);    target.__prefix = prefix;  };}@Controller('users')   // 先调工厂('users'),拿到真正的装饰器class UserController {}// 输出:// 工厂被调用,prefix = users// 装饰器执行,给 UserController 加路由前缀 usersconsole.log(UserController.__prefix);  // 'users'

执行顺序:@Controller('users') = 先执行 Controller('users')(工厂)→ 拿到返回的装饰器函数 → 再把它作用到类上。

1.3) 方法装饰器:能改方法行为

方法装饰器收到 3 个参数:目标对象、方法名、属性描述符。

function Log(target, key, descriptor) {  const original = descriptor.value;   // 拿到原方法  descriptor.value = function(...args) {    console.log(`调用 ${key},参数:`, args);    const result = original.apply(this, args);  // 调原方法    console.log(`${key} 返回:`, result);    return result;  };}class Calculator {  @Log  add(a, b) { return a + b; }}const c = new Calculator();c.add(1, 2);// 输出:// 调用 add,参数:[1, 2]// add 返回:3

这就是 NestJS 拦截器/守卫的底层:方法装饰器能包住原方法,在前后加逻辑。NestJS 的 @Get()、@UseGuards() 本质都是在类/方法上写元数据,运行时 Nest 再根据这些元数据决定怎么处理请求。

1.4) 属性装饰器 & 参数装饰器

// 属性装饰器:目标.prototype, 属性名function Max(limit) {  return function(target, key) {    // 把校验规则记到类上    const rules = target.__rules || (target.__rules = {});    rules[key] = { max: limit };  };}// 参数装饰器:第三个参数是参数索引function Param(name) {  return function(target, methodName, paramIndex) {     // 先记录/存储下来,然后nest等http请求过来时,     // 再匹配对应的参数拿到对应的值     console.log(`参数装饰器:${methodName} 的第 ${paramIndex} 个参数来自 ${name}`);  };}class UserController {  @Max(100)  name = '';  getUser(@Param('id') id) {}}// 输出:参数装饰器:getUser 的第 0 个参数来自 id

1.5)总结

装饰器类型
收到的参数
NestJS 例子
类装饰器
类构造函数
@Module()@Controller()
方法装饰器
prototype, 方法名, descriptor
@Get()@UseGuards()
属性装饰器
prototype, 属性名
@MaxLength()
(DTO 校验)
参数装饰器
prototype, 方法名, 参数索引
@Param()@Body()@Headers()

1.6)NestJS 的装饰器到底干了什么?

以 @Module() 和 @Injectable() 为例:

@Injectable()classUserService{ constructor(private db: Database) {}}

↓ Nest 在背后做了什么

1. Injectable() 给 UserService 打上标记:"这个类可以被 DI 容器管理"

2. TS 编译时把构造函数的参数类型(Database)保存到 UserService 上

3. Nest 启动时扫描所有 @Module,看到 providers: [UserService]

4. DI 容器读 UserService 的参数类型 → 发现要 Database → 先 new Database()

5. 再 new UserService(databaseInstance),缓存为单例

关键:步骤 2 依赖 emitDecoratorMetadata 这个 TS 编译选项——它让 TS 自动把"构造函数参数类型"写入元数据。没有这个选项,Nest 不知道要注入什么。

1.7) 手写一个迷你 DI/IoC 容器

用原生 JS 实现 NestJS 的核心:装饰器标记 + 容器自动注入。

// ===== ① 全局容器 =====const container = new Map();// ===== ② @Injectable() 装饰器:把类注册到容器 =====function Injectable() {  return function(Target) {    container.set(Target, null);  // 先占位,实例化时再填  };}// ===== ③ 业务类 =====class Database {  query(sql) { return `执行 ${sql}`; }}@Injectable()class UserService {  constructor(db) {  // 真实 Nest 里靠 TS 元数据自动识别 db: Database    this.db = db;  }  getUser() { return this.db.query('SELECT * FROM users'); }}// ===== ④ 手动注册 Database(真实 Nest 里在 @Module providers 里)=====container.set(Database, new Database());// ===== ⑤ 解析容器:递归创建所有依赖 =====function resolve(Target) {  if (container.get(Target)) return container.get(Target);  // 已实例化,返回单例  // 真实 Nest:这里读构造函数参数类型元数据,自动决定依赖谁  // 我们简化:手动写死 UserService 依赖 Database  const deps = Target === UserService ? [Database] : [];  const depInstances = deps.map(resolve);  const instance = new Target(...depInstances);  container.set(Target, instance);  return instance;}// ===== ⑥ 使用 =====const userService = resolve(UserService);console.log(userService.getUser());// 输出:执行 SELECT * FROM users
  • @Injectable()
     只是往 Map 里塞了个占位符。
  • resolve()
     递归地 new 依赖,缓存为单例。
  • NestJS 多出来的部分:用 TS 元数据(@Module()装饰器在providers中存储)自动发现 构造函数参数类型(不用手写 deps)、模块作用域、循环依赖检测。

1.8 )它做三件事:

  • 标记: 给类/方法打标签(@Injectable、@Controller)

  • 存元数据: 把路由前缀、参数来源、校验规则写到类上

  • 改行为: 包住原方法,前后加逻辑(@Log、拦截器)

NestJS 在启动时扫描这些元数据,决定怎么路由、怎么注入依赖、怎么执行守卫和管道。

1.9)常见误区:

  • ❌ 装饰器在 new Class() 时执行——错,在 class 定义时就执行了。
  • ❌ 装饰器是"注解"——它是真实函数,可以执行任意逻辑。
  • ❌ @Controller('users') 里的 'users' 是字符串传参——对,但它先经工厂函数返回真正的装饰器。
1.10)补充下装饰器执行顺序:

TS 装饰器代码执行顺序,不会影响 Nest 请求流水线的执行顺序!这里要分开两件事:

  1. 编译阶段:TS 装饰器(元数据写入)
    只是打标记、存元数据
  2. 运行阶段:HTTP 请求到达时
    Nest 读取元数据,固定按请求链路执行 Pipe / Guard / Interceptor,和装饰器书写先后无关
不过要注意 TS 的官方规则
注意装饰器的执行顺序:1) 装饰器表达式(工厂函数)从上到下求值;2)装饰器函数调用从下到上。

2. 中间件 Middleware

在守卫之前执行,处理更"底层"的事:

CORS、请求体解析、静态资源、简单的请求日志。

类中间件必须实现 NestMiddleware 接口(use() 方法)。

// src\fundamentals\common\middleware\logger.middleware.tsimport { Injectable, Logger, NestMiddleware } from '@nestjs/common'import { Request, Response } from 'express'@Injectable()export class LoggerMiddleware implements NestMiddleware {  use(req: Request, res: Response, next: () => void) {    const { method, path } = req    Logger.log(`${method}${path}`)    next()  }}// src\app.module.ts// 在模块里配置(只能函数式配置在模块,或用 configure())export class AppModule {  configure(consumer: MiddlewareConsumer) {    // 为所有路由应用 LoggerMiddleware 中间件,排除 hello 路由的 POST 请求, 其他路由都应用 LoggerMiddleware 中间件    consumer.apply(LoggerMiddleware).exclude({ path: 'hello', method: RequestMethod.POST }).forRoutes('*')  }}

3. 守卫 Guard:认证 & 授权

"请求能不能进来?" 返回 true 放行,false/抛错拒绝。

import { Injectable, CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common';@Injectable()export class AuthGuard implements CanActivate {  canActivate(context: ExecutionContext): boolean {    const req = context.switchToHttp().getRequest();    const token = req.headers['authorization'];    if (!token) throw new UnauthorizedException('未登录');    return true;  }}
// 用法:控制器级 / 方法级 / 全局@UseGuards(AuthGuard)@Controller('users')export classUserController{}// 全局守卫(main.ts 或 provider 注册)app.useGlobalGuards(new AuthGuard());

守卫 vs 中间件:守卫能拿到 ExecutionContext(含路由元数据),能用 Reflector 读自定义装饰器(如 @Roles('admin'))做角色鉴权——中间件做不到。这是守卫存在的最大理由。

4. 管道 Pipe:校验 + 转换

作用有两个:① 转换(string → number);② 校验(不合法直接抛 400)。

import {   Controller, Post, Body, UsePipes,  ValidationPipe, ParseIntPipe } from '@nestjs/common';import { IsString, IsEmail, MinLength } from 'class-validator';export class CreateUserDto {  @IsString()  name: string;  @IsEmail()  email: string;  @MinLength(6)  password: string;}@Controller('users')export class UserController {  // 局部管道:只对这个 handler 生效  @Post()  @UsePipes(new ValidationPipe())  create(@Body() dto: CreateUserDto) { ... }  // 参数级管道:把 '1' 转成数字 1  @Get(':id')  findOne(@Param('id', ParseIntPipe) id: number) { ... }}

5.  控制器 

controller 前面可能还有请求拦截器,然后再到 控制器

import { Controller, Get, Post, Body, Param, Query, Headers, HttpCode } from '@nestjs/common';@Controller('users')   // 路由前缀:/usersexport class UserController {  @Get()                          // GET /users  findAll(@Query() query: any) { ... }  @Get(':id')                    // GET /users/1  findOne(@Param('id') id: string) { ... }  @Post()                         // POST /users  @HttpCode(201)  create(@Body() body: CreateUserDto) { ... }  @Get('header')  readHeader(@Headers('authorization') auth: string) { ... }}

参数装饰器速记

装饰器
取值
@Body()
请求体(POST/PUT 的 JSON)
@Param('id')
路径参数(/users/:id)
@Query('page')
查询参数(?page=1)
@Headers('token')
请求头
@Req() / @Res()
原始 Express 的 req / res(用了 @Res 要自己 end,慎用)

参数装饰器自己拿不到任何请求数据。它只是在类定义那一刻,把"第 N 个参数来自 req 的哪个字段"记到元数据里;等真实请求到来时,Nest 才读这条笔记、从 req 里取值、拼成参数数组传给方法。

参数装饰器的签名:只能"记",不能"改"

参数装饰器收到 3 个参数,注意它没有返回值、没有描述符——它天生就不是用来改行为的,只是用来记录信息:

function Param(data) {  // 返回真正的参数装饰器  return function (target, propertyKey, parameterIndex) {    // target        : 类的 prototype(UserController.prototype)    // propertyKey   : 方法名('getUser')    // parameterIndex: 参数下标(0 表示第 0 个参数)    console.log(`记录:${propertyKey} 的第 ${parameterIndex} 个参数来自 params 的 ${data}`);  };}class UserController {  getUser(@Param('id') id) {}}// 输出:记录:getUser 的第 0 个参数来自 params 的 id

6. 拦截器 Interceptor:AOP 切面

"请求进来前、响应出去前,都能插一手"。

import {   Injectable, NestInterceptor,   ExecutionContext, CallHandler } from '@nestjs/common';import { map, tap } from 'rxjs';@Injectable()export class LoggingInterceptor implements NestInterceptor {  intercept(context: ExecutionContext, next: CallHandler) {    console.log('请求进来了');    return next.handle().pipe(      tap(() => console.log('响应出去了')),      map((data) => ({ code: 0, data })),   // 统一包装响应体    );  }}

经典用途:统一响应包装 {code, data, msg}、日志、缓存、超时控制(timeout())、接口耗时统计。基于 RxJS Observable,所以能拿到响应流做异步变换——这是拦截器比中间件强的点。

7. 异常过滤器 Exception Filter

"所有抛出的异常,统一在这里变成响应"。

import { ExceptionFilter, Catch, ArgumentsHost, HttpException} from '@nestjs/common';@Catch(HttpException)  // 只捕获 HTTP 异常;@Catch() 捕获所有export class HttpExceptionFilter implements ExceptionFilter {  catch(exception: HttpException, host: ArgumentsHost) {    const ctx = host.switchToHttp();    const res = ctx.getResponse();    const status = exception.getStatus();    res.status(status).json({      code: status,      message: exception.message,      timestamp: new Date().toISOString(),    });  }}

生产用法:定义统一响应格式({code, message, timestamp}),把 HttpExceptionFilter 设为全局,所有错误都长一个样。业务代码里直接 throw new BadRequestException('xxx') 即可。

// src/main.tsimport { NestFactory } from '@nestjs/core'import { AppModule } from './app.module'import { HttpExceptionFilter } from './fundamentals/common/filters/http-exception.filter'async function bootstrap() {  const app = await NestFactory.create(AppModule)  // 全局过滤器  app.useGlobalFilters(new HttpExceptionFilter())  app.setGlobalPrefix('api')  await app.listen(8080)}bootstrap()
8. 总结
HTTP请求进来  ↓Middleware(中间件)  ↓Guard 守卫(鉴权/权限)  ↓【Interceptor 拦截器:入站逻辑(intercept 里面,next.handle() 之前的代码)】  ↓Pipe 管道(参数解析、转换、DTO校验 ValidationPipe)  ↓Controller 控制器方法  ↓【Interceptor 拦截器:出站逻辑(next.handle()返回Observable,pipe/map处理响应)】  ↓ExceptionFilter 异常过滤器(任何环节抛异常都会跳到这里)  ↓返回HTTP响应
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-10-13 06:34:55 HTTP/1.1 GET : http://www.sjds.net/a/522648.html
  2. 运行时间 : 0.075925s [ 吞吐率:13.17req/s ] 内存消耗:4,345.39kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=38b99f015f96d37b62584d06b35b9603
  1. /www/wwwroot/www.sjds.net/public/index.php ( 0.79 KB )
  2. /www/wwwroot/www.sjds.net/vendor/autoload.php ( 0.17 KB )
  3. /www/wwwroot/www.sjds.net/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /www/wwwroot/www.sjds.net/vendor/composer/platform_check.php ( 0.90 KB )
  5. /www/wwwroot/www.sjds.net/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /www/wwwroot/www.sjds.net/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /www/wwwroot/www.sjds.net/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /www/wwwroot/www.sjds.net/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /www/wwwroot/www.sjds.net/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /www/wwwroot/www.sjds.net/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /www/wwwroot/www.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /www/wwwroot/www.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /www/wwwroot/www.sjds.net/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /www/wwwroot/www.sjds.net/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /www/wwwroot/www.sjds.net/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /www/wwwroot/www.sjds.net/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /www/wwwroot/www.sjds.net/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /www/wwwroot/www.sjds.net/app/provider.php ( 0.19 KB )
  23. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /www/wwwroot/www.sjds.net/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /www/wwwroot/www.sjds.net/app/common.php ( 0.03 KB )
  27. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /www/wwwroot/www.sjds.net/config/app.php ( 0.95 KB )
  30. /www/wwwroot/www.sjds.net/config/cache.php ( 0.78 KB )
  31. /www/wwwroot/www.sjds.net/config/console.php ( 0.23 KB )
  32. /www/wwwroot/www.sjds.net/config/cookie.php ( 0.56 KB )
  33. /www/wwwroot/www.sjds.net/config/database.php ( 2.48 KB )
  34. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /www/wwwroot/www.sjds.net/config/filesystem.php ( 0.61 KB )
  36. /www/wwwroot/www.sjds.net/config/lang.php ( 0.91 KB )
  37. /www/wwwroot/www.sjds.net/config/log.php ( 1.35 KB )
  38. /www/wwwroot/www.sjds.net/config/middleware.php ( 0.19 KB )
  39. /www/wwwroot/www.sjds.net/config/route.php ( 1.89 KB )
  40. /www/wwwroot/www.sjds.net/config/session.php ( 0.57 KB )
  41. /www/wwwroot/www.sjds.net/config/trace.php ( 0.34 KB )
  42. /www/wwwroot/www.sjds.net/config/view.php ( 0.82 KB )
  43. /www/wwwroot/www.sjds.net/app/event.php ( 0.25 KB )
  44. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /www/wwwroot/www.sjds.net/app/service.php ( 0.13 KB )
  46. /www/wwwroot/www.sjds.net/app/AppService.php ( 0.26 KB )
  47. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /www/wwwroot/www.sjds.net/vendor/services.php ( 0.14 KB )
  53. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /www/wwwroot/www.sjds.net/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /www/wwwroot/www.sjds.net/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /www/wwwroot/www.sjds.net/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /www/wwwroot/www.sjds.net/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /www/wwwroot/www.sjds.net/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /www/wwwroot/www.sjds.net/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /www/wwwroot/www.sjds.net/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /www/wwwroot/www.sjds.net/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /www/wwwroot/www.sjds.net/app/Request.php ( 0.09 KB )
  84. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /www/wwwroot/www.sjds.net/app/middleware.php ( 0.25 KB )
  86. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /www/wwwroot/www.sjds.net/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /www/wwwroot/www.sjds.net/route/app.php ( 1.72 KB )
  100. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /www/wwwroot/www.sjds.net/app/controller/Index.php ( 4.81 KB )
  104. /www/wwwroot/www.sjds.net/app/BaseController.php ( 2.05 KB )
  105. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /www/wwwroot/www.sjds.net/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /www/wwwroot/www.sjds.net/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /www/wwwroot/www.sjds.net/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /www/wwwroot/www.sjds.net/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /www/wwwroot/www.sjds.net/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /www/wwwroot/www.sjds.net/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /www/wwwroot/www.sjds.net/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /www/wwwroot/www.sjds.net/runtime/temp/022a5b1eae5a9e3c31e54f699d8ae600.php ( 8.05 KB )
  140. /www/wwwroot/www.sjds.net/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000698s ] mysql:host=172.18.0.4;port=3306;dbname=www_sjds;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001000s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000391s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000373s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000684s ]
  6. SELECT * FROM `set` [ RunTime:0.000307s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000713s ]
  8. SELECT * FROM `article` WHERE `id` = 522648 LIMIT 1 [ RunTime:0.000569s ]
  9. UPDATE `article` SET `lasttime` = 1791844495 WHERE `id` = 522648 [ RunTime:0.003911s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000349s ]
  11. SELECT * FROM `article` WHERE `id` < 522648 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000485s ]
  12. SELECT * FROM `article` WHERE `id` > 522648 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000380s ]
  13. SELECT * FROM `article` WHERE `id` < 522648 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000658s ]
  14. SELECT * FROM `article` WHERE `id` < 522648 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000542s ]
  15. SELECT * FROM `article` WHERE `id` < 522648 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000596s ]
0.088302s