You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:06:07