Sanity 文档函数实战:用 slack-notify 构建内容发布即通知的 Slack 自动化流程

发布时间:2026/11/5 16:41:48

Sanity 文档函数实战:用 slack-notify 构建内容发布即通知的 Slack 自动化流程 Sanity 文档函数实战用 slack-notify 构建内容发布即通知的 Slack 自动化流程【免费下载链接】sanitySanity Studio – Rapidly configure content workspaces powered by structured content项目地址: https://gitcode.com/GitHub_Trending/sa/sanitySanity Functions 是运行在 Sanity 云环境中的服务端函数能够对内容事件做出实时响应。本指南以 examples/functions/slack-notify 为蓝本讲解如何基于sanity/blueprints与slack/web-api构建一个「文章创建即推送 Slack 通知」的文档函数从创建 Slack 应用、配置 blueprint、本地测试到生产部署全流程。读完本文你将掌握 Sanity 文档函数Document Function的事件触发、投影过滤、环境变量管理以及 CLI 测试/部署/日志排障的完整技能并能在此基础上自由扩展消息格式与触发条件。问题与解决方案问题内容团队需要在新内容产生时第一时间知晓但手动通知成员既耗时又容易遗漏。团队期望获得包含关键信息标题、发布日期以及直达链接发布页面 Studio 编辑器的自动化通知。解决方案利用 Sanity 的文档函数document function监听内容创建事件配合 Slack Web API在文章发布时自动向指定频道发送一条格式化消息包含文章标题、创建时间以及指向发布页面和 Studio 编辑器的快捷链接。收益团队即时获知新内容动态提供发布页与 Studio 的一键直达入口便于快速审阅和推广减少手动通知的工作量缩短内容审阅与推广的响应时间适用模板与 Schema 要求该函数与任何包含post文档类型含title与slug字段的官方 clean 模板兼容建议先在本地安装的模板中试用。函数对 post 文档的 schema 要求如下字段类型说明titlestring文章标题slugslug 类型含current属性用于拼接网页 URL大多数官方模板已内置这些字段。若缺失需在 schema 中补充后才可触发通知。实现步骤1. 创建 Slack 应用并获取 OAuth Token创建应用在 Slack 的 App 管理后台api.slack.com/apps点击 Create New App选择 From scratch为应用取一个描述性名称如 Sanity Content Notifications并从下拉框选择你的工作区。配置权限进入 OAuth Permissions 页面滚动到 Scopes 部分在 Bot Token Scopes 下点击 Add an OAuth Scope添加chat:write权限允许机器人发送消息。安装应用点击 Install to Workspace审阅权限后点击 Allow复制以xoxb-开头的 Bot User OAuth Token下一步将用到。将应用邀请进频道进入接收通知的 Slack 频道如#test-channel输入/invite your-app-name或点击频道名 → Settings → Integrations → Add apps选择刚创建的应用将其加入频道2. 初始化示例若尚未初始化 blueprints先执行npx sanity blueprints init按提示选择你的组织和 Sanity studio。然后添加 slack-notify 函数示例npx sanity blueprints add function --example slack-notify3. 在 blueprint 中添加资源配置在项目根目录的sanity.blueprint.ts中注册该文档函数// sanity.blueprint.ts import dotenv/config import process from node:process import {defineBlueprint, defineDocumentFunction} from sanity/blueprints export default defineBlueprint({ resources: [ defineDocumentFunction({ name: slack-notify, src: ./functions/slack-notify, memory: 1, timeout: 10, event: { on: [create], filter: _type post, projection: {_id, title, slug, _createdAt}, }, env: { SLACK_OAUTH_TOKEN: process.env.SLACK_OAUTH_TOKEN, SLACK_CHANNEL: process.env.SLACK_CHANNEL, BASE_URL: process.env.BASE_URL, STUDIO_URL: process.env.STUDIO_URL, }, }), ], })各配置项的作用配置项取值说明nameslack-notify函数名称本地测试、部署、env/logs 命令均按此引用src./functions/slack-notify函数代码所在目录memory1分配给函数的内存GB轻量通知任务 1 即可timeout10函数超时时间秒event.on[create]触发事件文档创建时执行event.filter_type post过滤条件仅post类型文档触发避免无关文档造成不必要的执行event.projection{_id, title, slug, _createdAt}投影字段注入事件负载的最小字段集env见下节注入到函数运行时的环境变量该示例的资源元数据也固化在 examples/functions/slack-notify/package.json 的blueprintResourceItem字段中而 examples/sanity.blueprint.ts 展示了如何扫描functions/目录自动发现并注册所有示例函数可作为批量配置多个函数的参考模式。4. 安装依赖在项目根目录执行npm installslack-notify 函数本身依赖sanity/functions提供documentEventHandler与slack/web-api提供 Slack 消息发送能力两者版本声明见 examples/functions/slack-notify/package.json。5. 配置环境变量在项目根目录创建.env文件# Required SLACK_OAUTH_TOKENxoxb-your-slack-bot-token-here # Optional (defaults shown) SLACK_CHANNELgeneral BASE_URLhttp://localhost:3000 STUDIO_URLhttp://localhost:3333变量必填默认值说明SLACK_OAUTH_TOKEN是无Slack 机器人 OAuth Tokenxoxb-开头SLACK_CHANNEL否general目标 Slack 频道名BASE_URL否http://localhost:3000网站发布页URL 前缀STUDIO_URL否http://localhost:3333Sanity Studio URL 前缀源码解析通知消息是如何组装的打开 examples/functions/slack-notify/index.ts 可以看到核心实现。函数从node:process的env读取配置并为可选变量提供与 blueprint 一致的默认值import {env} from node:process import {documentEventHandler} from sanity/functions import {WebClient} from slack/web-api const { SLACK_OAUTH_TOKEN , SLACK_CHANNEL , BASE_URL http://localhost:3000, STUDIO_URL http://localhost:3333, } envhandler由documentEventHandler包装事件负载中的投影字段通过event.data访问。消息在一条模板字符串中完成组装标题缺省时降级为Untitledslug 缺失时降级为no-slug日期通过new Date(event.data._createdAt).toLocaleString()格式化export const handler documentEventHandler(async ({event}) { // Initialize Slack client const slack new WebClient(SLACK_OAUTH_TOKEN) try { // Prepare message content const message *New Document Created!*\nTitle: ${event.data.title || Untitled}\nWebpage: ${BASE_URL}/posts/${event.data.slug?.current || no-slug}|Click Here\nStudio: ${STUDIO_URL}/structure/post;${event.data._id}|Click Here\nDateTime Created: ${new Date(event.data._createdAt).toLocaleString()} // Send message to Slack await slack.chat.postMessage({ channel: SLACK_CHANNEL, text: message, }) console.log( Slack notification sent successfully to channel:, SLACK_CHANNEL, Message sent:, message, ) } catch (error) { console.error(Error sending Slack notification:, error) throw error } })几个值得注意的实现要点event.data直接来自 blueprint 的 projection这里仅能访问{_id, title, slug, _createdAt}四个字段若要使用更多字段须同步修改 projection。WebClient 的初始化时机new WebClient(SLACK_OAUTH_TOKEN)在每次调用时创建token 为空时 Slack API 会返回invalid_auth错误这正是下文故障排查中常见错误之一的根因。错误处理catch 中console.error后重新throw便于在函数日志中定位问题。本地测试数据examples/functions/slack-notify/document.json 提供了一份样例文档_type: post、_id: drafts.test-document-id、_createdAt等供npx sanity functions test直接使用无需连接真实数据集。本地测试函数部署前可用 Sanity CLI 在本地测试注意该函数需要有效的 Slack OAuth Token测试期间会真实地向目标频道发送消息请先确认环境变量已配置完成。1. 基础函数测试使用随示例附带的测试文档在项目根目录执行# If using .env file (recommended) npx sanity functions test slack-notify \ --file functions/slack-notify/document.json \ --dataset production \ --with-user-token # Or set environment variables inline SLACK_OAUTH_TOKENxoxb-your-token SLACK_CHANNELtest-channel \ npx sanity functions test slack-notify \ --file functions/slack-notify/document.json \ --dataset production \ --with-user-token备选方案用数据集中的真实文档测试——先从 studio 目录导出一篇现有 postcd studio npx sanity documents query *[_type post][0] ../real-post.json # Back to project root for function testing cd .. npx sanity functions test slack-notify \ --file real-post.json \ --dataset production \ --with-user-token同样支持用内联环境变量替换--file前的配置方式。2. 不实际发送消息的测试若只想验证函数逻辑而不真正发送 Slack 消息可临时注释掉slack.chat.postMessage调用改为仅console.log输出将要发送的消息内容。3. 交互式开发模式启动开发服务器进行交互测试SLACK_OAUTH_TOKENslack-OAuth-token npx sanity functions dev该命令会打开一个交互式 playground支持用自定义数据测试函数。测试建议使用专用测试频道为开发创建独立频道避免打扰生产频道成员。使用真实的 Slack Token函数依赖有效 OAuth Token 才能工作。测试期间留意频道观察指定频道是否收到测试消息。测试边界情况尝试无title或无slug的文档确认函数能优雅降级源码中|| Untitled、|| no-slug正是为此设计。部署到生产环境本地测试通过后即可部署。部署前请确认你拥有 Sanity 项目的 Deploy Studio 权限。部署前置条件Sanity CLI v3.92.0 或更高版本项目的 Deploy Studio 权限Node.js v22.x与生产运行时一致具备chat:write权限的有效 Slack OAuth Token部署步骤1. 校验 blueprint 配置确认sanity.blueprint.ts中函数配置正确事件、过滤、投影与环境变量部署时无需再重复传入env映射但需保证.env已存在// sanity.blueprint.ts import {defineBlueprint, defineDocumentFunction} from sanity/blueprints export default defineBlueprint({ resources: [ defineDocumentFunction({ name: slack-notify, src: ./functions/slack-notify, memory: 1, timeout: 10, event: { on: [create], filter: _type post, projection: {_id, title, slug, _createdAt}, }, }), ], })2. 部署 blueprint在项目根目录执行npx sanity blueprints deploy该命令会打包函数代码 → 上传到 Sanity 基础设施 → 配置 post 创建的事件触发器 → 使 slack-notify 函数在生产环境生效。3. 添加环境变量部署后需将 Slack OAuth Token 添加为函数环境变量npx sanity functions env add slack-notify SLACK_OAUTH_TOKEN your-slack-oauth-token-here将your-slack-oauth-token-here替换为实际的xoxb-Token。可通过以下命令验证是否添加成功npx sanity functions env list slack-notify4. 验证部署新建一篇 post确认 Slack 收到通知通过 CLI 监控函数日志npx sanity functions logs slack-notify部署最佳实践先充分测试始终在本地验证通过后再部署。使用精确的过滤条件当前 filter 仅匹配 post避免不必要执行、节省资源。监控性能这是一个轻量函数资源需求极小但仍建议通过日志保持观察。部署故障排查错误可能原因解决办法Deploy Studio permission required账号缺少部署权限请项目管理员授予 Deploy Studio 权限Blueprint validation failedsanity.blueprint.ts配置有误核对配置是否符合 blueprint 预期 schemaFunction not sending Slack notifications after deploymentOAuth Token 无效或频道访问受限检查 Slack 应用配置确认机器人已被邀请进目标频道Missing environment variable SLACK_OAUTH_TOKEN生产环境未设置环境变量在 Sanity 项目设置中配置SLACK_OAUTH_TOKEN使用效果示例当创建新的 post 文档时函数自动完成提取标题、slug 与创建时间 → 组装 Slack 消息 → 发送到指定频道 → 附带网页与 Studio 编辑器的直达链接。Slack 中收到的消息形如*New Document Created!* Title: Getting Started with Sanity Webpage: http://localhost:3000/posts/getting-started-with-sanity|Click Here Studio: http://localhost:3333/structure/post;post-id|Click Here DateTime Created: 1/15/2024, 10:30:00 AM自定义通知行为修改 URL 与 Slack 频道README 建议通过修改函数顶部的配置常量来定制// Configuration constants const baseUrl https://your-domain.com // Update to your production URL const studioUrl https://your-studio.sanity.studio // Update to your studio URL const slackChannel your-channel-name // Update to your target channel从源码结构看index.ts 中这些值实际来自环境变量BASE_URL、STUDIO_URL、SLACK_CHANNEL并带 localhost 默认值因此更推荐的定制方式是直接修改 blueprint 的env映射或.env文件部署后则使用npx sanity functions env add更新无需改动代码。修改消息格式text: Your custom message format with ${event.data.title},增加更多文档字段通过event.data.fieldName访问更多字段同时记得在 blueprint 的projection中把新字段加进投影否则事件负载中不会包含该字段。修改通知触发条件调整 blueprint 配置中的filter即可针对不同的文档类型或条件触发例如改为_type news或叠加defined(...)判断可参考 telegram-notify 示例 中的_type comment defined(comment)写法。常见故障排查错误可能原因解决办法An API error occurred: invalid_authSlack OAuth Token 无效或缺失确认 Token 正确且具备chat:write权限An API error occurred: channel_not_found频道不存在或机器人无权访问确认频道存在并把 Slack 应用邀请进频道Missing environment variable SLACK_OAUTH_TOKEN环境变量未设置用SLACK_OAUTH_TOKEN配置机器人 TokenMessages not appearing in Slack机器人缺权限或不在频道内将机器人加入目标频道并确认chat:write权限相关示例Telegram Notify —— 文档创建时发送 Telegram 通知实现思路与本示例高度一致事件触发 环境变量注入 消息链接可作为横向对比参考它额外演示了defined()过滤写法、内联键盘回复以及根据 localhost 判断消息形态的条件逻辑。需求清单速览完成本示例所需的前提一个 Sanity 项目一个具备管理员权限可创建应用的 Slack 工作区带chat:write权限的 Slack OAuth Token含title与slug字段的 post schema本地测试需 Node.js v22.x。【免费下载链接】sanitySanity Studio – Rapidly configure content workspaces powered by structured content项目地址: https://gitcode.com/GitHub_Trending/sa/sanity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/31 14:10:24

10分钟语音克隆:RVC本地部署,第一条变声音频这样出

10分钟语音克隆&#xff1a;RVC本地部署&#xff0c;第一条变声音频这样出 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice…

2026/10/25 10:30:39

论文降重实战:从AI检测到人工优化的完整方案

1. 论文降重实战&#xff1a;从90%到10%的蜕变之路去年帮学弟修改毕业论文时&#xff0c;查重报告上那个刺眼的90%AI率让我记忆犹新。经过两周的实战调整&#xff0c;最终定稿的查重率降到了惊人的10%以下。这个过程中积累的降重技巧&#xff0c;远比网上那些"替换同义词&…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述&#xff1a;大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈&#xff0c;构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师&#xff0c;我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 13:55:19

GD32E10x官方例程入门:从GPIO点灯到串口调试

简介&#xff1a;这份GD32E10x系列官方例程面向嵌入式硬件与单片机开发者&#xff0c;基于ARM Cortex-M3内核&#xff0c;汇集兆易创新GD32E10x的示例代码&#xff0c;适合工业控制、消费电子、通信设备等场景的学习、验证与二次开发。压缩包共935个文件&#xff0c;约11.16MB&…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代&#xff0c;基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而&#xff0c;与配合度高的人类不同&#xff0c;宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态&#xff0c;更无法控制光照环境。实际应用中&#xff0c;我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时&#xff0c;Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门&#xff0c;我先说个结论&#xff1a;这事真不难&#xff0c;难的是资料太散、路线太多&#xff0c;今天这个框架明天那个工具&#xff0c;新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师&#xff0c;我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码&#xff0c;在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代&#xff0c;基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而&#xff0c;与配合度高的人类不同&#xff0c;宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态&#xff0c;更无法控制光照环境。实际应用中&#xff0c;我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑