You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:09:29