Contentful使用getEntries如何仅查询已发布非草稿状态数据
解决方案
首先明确核心规则:如果你使用的是Contentful Delivery API(生产环境默认接口),不需要加任何额外查询参数,接口默认就只会返回已发布的正式内容,不会返回纯草稿、已归档、存在未发布修改的条目。
如果你现在的查询结果里出现了草稿内容,优先检查两个配置问题:
- 你填入的
CONTENTFUL_ACCESS_TOKEN是不是错用了Preview API的预览令牌,Delivery API的令牌本身没有权限拉取到草稿内容 - 初始化
createClient的时候有没有手动加host: 'preview.contentful.com'配置,把接口切到了预览环境,你当前贴的代码没有传这个host参数,默认走的就是正式Delivery接口,正常不会返回草稿。
如果你是在预览场景下必须使用Preview API,又需要过滤掉纯草稿内容,直接在getEntries的查询参数里加过滤规则即可,调整后的代码如下:
export const getAllPages = async (context?) => { const client = createClient({ space: process.env.CONTENTFUL_SPACE_ID, accessToken: process.env.CONTENTFUL_ACCESS_TOKEN, // 生产环境不要配置host,默认走正式发布接口 // 预览场景才需要打开下面这行 // host: 'preview.contentful.com' }); const pages = await client.getEntries({ content_type: "page", include: 10, "fields.slug[in]": `/${context.join().replace(",", "/")}`, // 预览环境下加这行即可过滤从未发布过的纯草稿 "sys.publishedAt[exists]": true }); return pages?.items?.map((item) => { const fields = item.fields; return { title: fields["title"], }; }); };
补充说明:
- 纯草稿条目从来没有执行过发布操作,
sys.publishedAt字段为空,通过exists判断就能直接过滤掉这类内容 - 生产环境强烈建议直接用默认的Delivery API,接口自带CDN缓存、性能更好,也不会因为手写过滤规则漏筛草稿内容。
内容的提问来源于stack exchange,提问作者Jeremy Love
相关产品推荐
相关产品推荐

