如何在 Angular 应用中发起 HTTP 302 redirect

发布时间 2023-12-09 13:06:53作者: JerryWang_汪子熙

代码如下:

import { RESPONSE } from '@nguniversal/express-engine/tokens'
import { Response } from 'express'
...
constructor(protected @Optional() @Inject(RESPONSE) serverResponse: Response) {}
...
// for example:
this.serverResponse?.status(302);

在这段代码中,涉及到Angular框架中的依赖注入(Dependency Injection)以及Angular Universal的服务端渲染(Server-Side Rendering)相关的内容。我将逐步解释这段代码的含义。

首先,我们导入了两个模块:

  1. RESPONSE@nguniversal/express-engine/tokens 中导入,这是Angular Universal提供的一个令牌(token)。
  2. Responseexpress 中导入,这是Node.js中处理HTTP响应的对象。

然后,在类的构造函数中,使用了Angular的依赖注入机制来注入 serverResponse 参数。这里的 @Optional() 表示这是一个可选的依赖,即如果系统中没有找到对应的 RESPONSE 对象,也不会导致注入失败。@Inject(RESPONSE) 表示要注入的是 RESPONSE 这个令牌对应的实例。这样,我们就能够在这个类的实例中使用 serverResponse 对象了。

接下来,给出了一个示例,使用 serverResponse 对象来设置HTTP响应的状态码为302。这个示例中使用了可选链操作符 ?.,这是ES6/TypeScript引入的语法,用于在访问可能为null或undefined的属性或方法时避免出现异常。

这段代码的主要作用是在Angular Universal应用中,通过依赖注入获取到服务端的HTTP响应对象,并在需要的时候对其进行操作。通常,这样的操作会在服务器端渲染期间,用于设置一些与HTTP响应相关的信息,例如状态码、头部信息等。

下面是一个更详细的示例,假设这个类是在Angular服务端渲染过程中的某个中间件或拦截器中使用的:

import { RESPONSE } from '@nguniversal/express-engine/tokens';
import { Response } from 'express';
import { Injectable, Optional, Inject } from '@angular/core';

@Injectable()
export class ServerResponseHandler {
  constructor(protected @Optional() @Inject(RESPONSE) serverResponse: Response) {}

  handleResponse(): void {
    // 设置状态码为302
    this.serverResponse?.status(302);

    // 设置响应头
    this.serverResponse?.set('Cache-Control', 'public, max-age=300');

    // 发送响应
    this.serverResponse?.send('Redirecting...');
  }
}

在这个示例中,我们定义了一个 ServerResponseHandler 类,该类包含一个 handleResponse 方法,用于处理服务器端的HTTP响应。在 handleResponse 方法中,通过 this.serverResponse 对象设置了状态码为302、设置了Cache-Control头部,并发送了一个简单的文本响应。这样的操作通常在需要进行服务器端重定向或设置缓存策略等场景中非常有用。