【问题标题】:Get current route in Next.js API route在 Next.js API 路由中获取当前路由
【发布时间】:2021-06-21 20:10:34
【问题描述】:

我想访问常规页面和 API 的当前路由(例如 /[user_id]/posts),以便我可以记录错误、增加页面命中计数器等。

我发现检索当前路由的唯一自动化方法是 useRouter,但这只能在 React 组件中访问。

我想避免在我的每个处理程序中对路由进行硬编码,因为这样很容易不同步。

如何在处理程序中自动检索当前路由?

【问题讨论】:

  • “处理程序”是什么意思?是否要访问服务器端的当前路由?
  • @juliomalves 是的。我在服务器端(处理程序/控制器)有一个给定 url 路径的入口点。当该入口点被命中时,我想访问与之匹配的路由。
  • 您的意思是像req.url 返回的内容吗?这可以在 getServerSideProps 和 API 路由中访问。
  • @juliomalves 有效,但它替代了参数,例如我得到/1515/posts 而不是/[user_id]/posts。我的意图是使用它作为服务器日志中的聚合键,当基数像那样爆炸时它不起作用

标签: next.js


【解决方案1】:

框架根本不支持它。我找到了 2 个替代方案:

1/ 使用其他框架,例如 Nest.js。使用 Nest,您可以在拦截器中访问路由器信息。例如。使用 Fastify 适配器:

@Injectable()
export class InstrumentationInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {
    return next.handle().pipe(
      tap(() => {
        const ctx = context.switchToHttp();
        console.log(ctx.getRequest().routerPath);
      }),
    );
  }
}

2/ 创建您自己的控制器基础架构并将元数据附加到每个控制器,例如:

export class UserController extends BaseController {
  getRoute(): string {
    return "/user/:userid";
  }
}

请注意,您需要手动使路由与您的文件结构保持同步。以上也可以通过装饰器进行编码。

3?/ 从理论上讲,您可以在 Nest 中配置 Custom Server 并使用支持检索路由路径的路由器,并带有一个钩子供您检索路由(例如,在中间件期间将其附加到请求对象)。如果您发现自己这样做了,请查看 1/。

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 1970-01-01
    • 2019-08-17
    • 2011-11-25
    • 2022-12-12
    • 2021-07-22
    • 2018-03-11
    • 2016-12-29
    • 2023-03-12
    相关资源
    最近更新 更多