Skip to content

监听资源更新

有两种形式:

  1. 资源列表变化
  2. 资源内容变化

资源列表变化#

用于监听资源目录是否发生增删改。

工作机制#

当服务器上的资源列表发生变化时(例如 resources/list 中的项发生增删),服务器主动发送通知

notifications/resources/list_changed

这个方法名也是固定的。

这样客户端就知道资源目录发生了变动,可以重新发起 resources/list 重新拉取。

这里需要做 2 件事情:

  1. 监听目录(涉及到回调函数,监听的目录发生了变化,就会触发对应的回调函数)
  2. 回调函数:向客户端发送通知

chokidar#

chokidar 是一个功能强大、跨平台、性能优秀的 文件系统监听库,适用于 Node.js 环境,底层使用原生 fs.watchfs.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('已停止监听'))

课堂练习

实现客户端订阅服务器资源,服务器端资源发生变化的时候,会通知客户端。

资源内容变化#

用于监听 某个资源内容的变更,如文件内容更新、数据库记录修改、日志追加等。

工作机制

  1. 客户端订阅更新,向服务器发送请求:

    resources/subscribe

    方法名固定为 resources/subscribe,表示我要订阅某个资源。

    带上要订阅的资源 URI,例如:

    { "uri": "file:///logs/error.log" }
  2. 服务器监听变动并通知客户端。当该资源发生变化时,发送通知:

    notifications/resources/updated
  3. 客户端拉取最新内容。收到通知后,客户端可以重新调用:

    resources/read
  4. 客户端取消订阅(可选)。如果客户端不再关心此资源,可以发送:

    resources/unsubscribe

-EOF-