在NestJS中如何不经过解析直接获取原始URL查询字符串
获取NestJS路由原始查询字符串的方案
你可以直接从原始请求对象中拆分URL得到未解析的原始查询字符串,两种实现方式如下:
方法1:直接注入请求对象提取
首先导入@Req装饰器和Express请求类型,在路由方法中注入原始请求后拆分originalUrl即可:
// 顶部导入 import { Get, Req } from '@nestjs/common'; import type { Request } from 'express'; // 原有路由修改 @Get('/orders') getOrders( @Query(ValidateQueryPipe) query: QueryParameters, @Req() req: Request ): Subscription { // 直接拆分原始URL获取查询字符串,无查询参数时返回空字符串 const rawQueryString = req.originalUrl.split('?')[1] ?? ''; // rawQueryString 即为你需要的 "key1=value1&key=value" 格式原始字符串 }
方法2:封装自定义装饰器(更推荐)
你可以把提取逻辑封装为自定义参数装饰器,后续在任意路由中都可以直接注入使用:
第一步:定义自定义装饰器
// src/common/decorators/raw-query.decorator.ts import { createParamDecorator, ExecutionContext } from '@nestjs/common'; import type { Request } from 'express'; export const RawQuery = createParamDecorator( (_, ctx: ExecutionContext) => { const req = ctx.switchToHttp().getRequest<Request>(); return req.originalUrl.split('?')[1] ?? ''; }, );
第二步:路由中使用
// controller中导入装饰器后直接使用 @Get('/orders') getOrders( @Query(ValidateQueryPipe) query: QueryParameters, @RawQuery() rawQueryString: string ): Subscription { // 直接使用rawQueryString即可 }
Fastify 底层适配
如果你的Nest项目底层使用Fastify而非Express,仅需替换请求类型即可,拆分逻辑完全一致:
import type { FastifyRequest } from 'fastify'; // 自定义装饰器中或注入请求时,把Request类型替换为FastifyRequest即可
内容的提问来源于stack exchange,提问作者LaCodeM
相关产品推荐
相关产品推荐

