有两种形式:
- 资源列表变化
- 资源内容变化
资源列表变化#
用于监听资源目录是否发生增删改。
工作机制#
当服务器上的资源列表发生变化时(例如 resources/list 中的项发生增删),服务器主动发送通知:
notifications/resources/list_changed这个方法名也是固定的。
这样客户端就知道资源目录发生了变动,可以重新发起 resources/list 重新拉取。
这里需要做 2 件事情:
- 监听目录(涉及到回调函数,监听的目录发生了变化,就会触发对应的回调函数)
- 回调函数:向客户端发送通知
chokidar#
chokidar 是一个功能强大、跨平台、性能优秀的 文件系统监听库,适用于 Node.js 环境,底层使用原生 fs.watch 和 fs.watchFile,并在 macOS/Linux 上优先使用更高效的 fsevents(若可用)。
基本用法:
import chokidar from 'chokidar'
// 监听单个文件或目录const watcher = chokidar.watch('./some-folder-or-file', { ignoreInitial: true, // 不触发初始的 add/addDir 事件})
// 注册事件监听器watcher .on('add', (path) => console.log(`📄 文件添加: ${path}`)) .on('change', (path) => console.log(`✏️ 文件修改: ${path}`)) .on('unlink', (path) => console.log(`❌ 文件删除: ${path}`)) .on('addDir', (path) => console.log(`📁 目录添加: ${path}`)) .on('unlinkDir', (path) => console.log(`🗑️ 目录删除: ${path}`))监听多个文件
chokidar.watch(['src/**/*.js', 'assets/**/*'], { ignored: /(^|[\/\\])\../, // 忽略 . 开头的隐藏文件})停止监听
watcher.close().then(() => console.log('已停止监听'))课堂练习
实现客户端订阅服务器资源,服务器端资源发生变化的时候,会通知客户端。
资源内容变化#
用于监听 某个资源内容的变更,如文件内容更新、数据库记录修改、日志追加等。
工作机制
-
客户端订阅更新,向服务器发送请求:
resources/subscribe方法名固定为
resources/subscribe,表示我要订阅某个资源。带上要订阅的资源 URI,例如:
{ "uri": "file:///logs/error.log" } -
服务器监听变动并通知客户端。当该资源发生变化时,发送通知:
notifications/resources/updated -
客户端拉取最新内容。收到通知后,客户端可以重新调用:
resources/read -
客户端取消订阅(可选)。如果客户端不再关心此资源,可以发送:
resources/unsubscribe
-EOF-