Express 使用该Request对象向 Node.js 服务器的控制器提供有关 HTTP 请求的数据。因此,应用层可用的请求中的所有数据都依赖于该对象。
您可能需要详细说明您在 HTTP 请求中收到的数据,并向控制器提供自定义信息。在 JavaScript 中,您可以简单地在对象中定义新属性Request并在需要时使用它们。Request在 TypeScript 中,如果要定义自定义属性,则需要扩展类型。
现在让我们了解RequestExpress 中的内容,并深入探讨Request在 TypeScript 中扩展类型有用的原因。然后,让我们看看如何Request通过使用 TypeScript 构建的 Express 演示应用程序来利用扩展对象。
TL;DR:让我们学习如何Request在 TypeScript 中扩展类型以使其实例存储您可以在控制器级别使用的自定义数据。
-
Express 中的 Request 对象是什么?
-
为什么要扩展请求?
-
在 TypeScript 中扩展 Express Request 类型
-
先决条件
-
将自定义属性添加到请求类型
-
-
使用扩展的 Request 对象
-
测试扩展请求
RequestExpress中的对象是什么?
该Request对象表示客户端对 Express 服务器执行的 HTTP 请求。换句话说,Express 服务器可以通过Request实例读取从客户端接收到的数据。因此,Request有几个属性可以访问 HTTP 请求中包含的所有信息,但最重要的是:
-
query
:此对象包含请求 URL 中存在的每个查询字符串参数的属性:
app.get("/users", (req: Request, res: Response) => { // on GET "/users?id=4" this would print "4" console.log(req.query.id) });
-
params
:此对象包含根据
Express 路由约定
在 API URL 中定义的参数:
app.get("/users/:id", (req: Request, res: Response) => { // on GET "/users/1" this would print "1" console.log(req.params.id) });
-
body
:此对象包含在 HTTP 请求正文中提交的键值对数据:
app.get("/users", (req: Request<never, never, { name: string; surname: string }, never>, res: Response) => { const { name, surname } = req.body // ... })
-
headers:此对象包含请求发送的每个 HTTP 标头的属性。
-
cookies:使用cookie-parserExpress 中间件时,该对象包含请求发送的每个 cookie 的属性
为什么要延长Request?
Express 控制器可以使用该对象访问包含在 HTTP 请求中的所有数据Request。这并不意味着Request对象是与控制器交互的唯一方式。相反,Express 也支持中间件。Express 中间件是可用于添加应用程序级或路由器级功能的功能。
中间件功能与路由器级别的端点相关联,如下所示:
const authenticationMiddleware = require("../middlewares/authenticationMiddleware") const FooController = require("../controllers/foo") app.get( "/helloWorld", FooController.helloWorld, // (req, res) => { res.send("Hello, World!") } // registering the authenticationMiddleware to the "/helloWorld" endpoint authenticationMiddleware, )
请注意,中间件函数在调用包含 API 业务逻辑的控制器函数之前执行。在此处了解有关它们如何工作以及 Express 中间件可以提供的更多信息。
这里需要注意的重要一点是中间件可以修改Request对象,添加自定义信息以使其在控制器级别可用。iPhone14用户抱怨蓝牙问题、性能问题及潜在问题的修复方法例如&#