Fastify 是一个快速、低开销、可扩展的 Node.js Web 框架。虽然它的特点在于 API 服务,但是它也支持与 WebSocket 相关的协议。在本文中,我们将介绍如何使用 Fastify 来实现 WebSocket 的支持。
WebSocket 简介
WebSocket 是一种基于帧的协议,它为双向通信提供了一种标准的方式。与 HTTP 不同,WebSocket 连接是持久的,这意味着可以在连接的生命周期内多次发送和接收数据,而不需要在每次请求时重新建立连接。WebSocket 通信始于握手(handshaking)过程,在第一次握手之后,客户端和服务器之间的连接得以建立和维持。
Fastify WebSocket
Fastify 内置了 fastify-websocket
插件,它允许您使用 WebSocket API 为 Fastify 应用程序提供 WebSocket 服务。使用该插件的第一步是将其注册到您的应用程序中。例如:
-- -------------------- ---- ------- ----- ------- - -------------------- ---------------------------------------------- -------------------- ----- -- - -- ----- - ---------------------- --------------- - --
现在您已经注册了 fastify-websocket
插件,您可以为任何 Fastify 路径启用 WebSocket 服务。为此,您可以在 Fastify 路由处理程序中使用 request.websocket()
方法:
fastify.get('/my-websocket', (request, reply) => { request.websocket((connection) => { connection.pipe(connection) }) })
在上述代码中,我们在 /my-websocket
路径上定义了一个 WebSocket 路由。该路由处理程序调用了 request.websocket()
方法,该方法调用时,request
对象自动升级为 WebSocket。然后我们创建了一个使用 pipe()
的无限管道,以便可以自由地从管道的一端发送数据,然后从管道的另一端接收数据。
现在我们已经定义了 WebSocket 路由,接下来我们将介绍如何管理 WebSocket 连接。在 Fastify 中,您可以使用 fastify.websocketServer
属性来访问 WebSocket 服务器。该服务器接口是 Node.js 的原生 WebSocket 服务器对象。例如:
-- -------------------- ---- ------- --------------------- --------- ------ -- - ----- ------ - ----------------------- --- ----- - - ----- -------- - -------------- -- - ------------------------------- -- - ------------------- ---------- -- ------- -- ----- ----------------------------------- ------------- ------------------------- -------- --------------------- -- -- - ----------------------- ------------------------------- -- - ------------------ -- -- --
在上述代码中,我们创建了一个路由处理程序,该程序将每秒钟将数据发送到连接到 /count
的客户端。为此,我们使用 WebSocket 服务器的 clients
属性,该属性是一个连接到服务器的客户端集合,我们遍历该集合并使用 send()
方法将数据发送到所有连接的客户端。还需要注意的是,我们在 reply.raw 上设置了 Content-Type,并始终保持连接。
总结
Fastify 使 WebSocket 开发变得容易。使用 fastify-websocket
插件,您可以快速轻松地向 Fastify 应用程序添加 WebSocket 支持。通过启用 WebSocket 服务,您可以创建具有实时功能的网络应用程序。我们希望这篇文章可以让您更好地理解 Fastify 如何支持 WebSocket,并为您提供了展示如何在您的 Fastify 项目中实现 WebSocket 的示例。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64507da3980a9b385b9839b3