首页 > 解决方案 > NestJs 重定向而不使用响应

问题描述

是否可以在不使用对象的情况下从 Nest 控制器进行重定向Response

现在我知道我们只能通过直接将Response对象注入到路由处理程序中来做到这一点。

标签: javascriptnode.jsnestjs

解决方案


你可以写一个RedirectInterceptor

@Injectable()
export class RedirectInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, stream$: Observable<any>): Observable<any> {
    const response = context.switchToHttp().getResponse();
    response.redirect('redirect-target');
    return stream$;
  }
}

然后像这样在你的控制器中使用它:

@Get('user')
@UseInterceptors(RedirectInterceptor)
getUser() {
  // will be redirected.
}

重要的是不要从您的控制器返回任何内容,否则您将收到以下错误:Can't set headers after they are sent.

如果需要,RedirectInterceptor也可以是动态的:

@Injectable()
export class RedirectInterceptor implements NestInterceptor {
  constructor(private readonly target: string) {}
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  intercept(context: ExecutionContext, stream$: Observable<any>): Observable<any> {
    const response = context.switchToHttp().getResponse();
    response.redirect(this.target);
                      ^^^^^^^^^^^
    return stream$;
  }
}

然后在控制器中:

@UseInterceptors(new RedirectInterceptor('redirect-target'))

推荐阅读