如何为Gatsby页面查询创建自定义resolver 隐藏非公开视频URL
问题原因
你之前的写法存在层级错误:url 是 SanityVideo 类型的自有字段,不是 SanityCourses.playlist 的配置项,所以挂载在 SanityCourses 下的 resolver 永远不会被触发。
解决方案
你可以直接重写 SanityVideo 类型的 url 字段解析逻辑,两种实现方式任选其一即可:
方案1:使用 createResolvers 实现
将以下代码写入 gatsby-node.js:
exports.createResolvers = ({ createResolvers }) => { const resolvers = { SanityVideo: { url: { resolve(source) { // source为当前video对象,public为false时返回空值 return source.public ? source.url : null } } } } createResolvers(resolvers) }
方案2:使用 createSchemaCustomization 显式定义
将以下代码写入 gatsby-node.js:
exports.createSchemaCustomization = ({ actions, schema }) => { const { createTypes } = actions const typeDefs = [ schema.buildObjectType({ name: "SanityVideo", fields: { url: { type: "String", resolve(source) { return source.public ? source.url : null } } } }) ] createTypes(typeDefs) }
生效操作
修改完成后执行 gatsby clean 清除本地缓存,再重启开发服务即可生效。非公开视频的 url 字段会返回 null,不会暴露原始地址,你可以根据业务需要把返回值替换为空字符串、权限提示文本等。
内容的提问来源于stack exchange,提问作者André Casal
相关产品推荐
相关产品推荐

