diff --git a/lib/db/SiteDataApi.js b/lib/db/SiteDataApi.js index 9546c635b85..b1eda8ba8b0 100644 --- a/lib/db/SiteDataApi.js +++ b/lib/db/SiteDataApi.js @@ -159,6 +159,10 @@ const EmptyData = pageId => { * ✅ 兼容 prefix / slug / suffix 任意组合 * ⚠️ 只能在 getStaticProps / getServerSideProps 使用 */ +/** + * 生产级稳定版本 + * 严格精确匹配,不做模糊匹配 + */ export async function resolvePostProps({ prefix, slug, @@ -167,7 +171,7 @@ export async function resolvePostProps({ from, }) { /** - * 1️⃣ 统一路径片段 + * 1️⃣ 统一路径 */ const segments = [] if (prefix) segments.push(prefix) @@ -175,51 +179,43 @@ export async function resolvePostProps({ if (Array.isArray(suffix)) segments.push(...suffix) const fullSlug = segments.join('/') - const source = from || `slug-props-${fullSlug}` - - /** - * 2️⃣ 构造所有可能命中的 slug - */ const lastSegment = segments[segments.length - 1] - - const slugCandidates = new Set([ - fullSlug, - lastSegment, - slug, - prefix, - ]) - - // 去掉 falsy - for (const s of Array.from(slugCandidates)) { - if (!s) slugCandidates.delete(s) - } + const source = from || `slug-props-${fullSlug}` /** - * 3️⃣ 拉取全局数据 + * 2️⃣ 拉全局数据 */ const props = await fetchGlobalAllData({ from: source, locale }) let post = null /** - * 4️⃣ 列表内匹配 + * 3️⃣ 一级匹配:完整 slug 精确匹配(核心) */ - post = props?.allPages?.find(p => { - if (!p || p?.type?.includes('Menu')) return false + if (fullSlug) { + post = props?.allPages?.find(p => { + if (!p || p?.type?.includes('Menu')) return false + return p.slug === fullSlug + }) + } - return ( - slugCandidates.has(p.slug) || - slugCandidates.has(p.slug?.split('/').pop()) || - slugCandidates.has(p.id) || - slugCandidates.has(idToUuid(p.id)) || - slugCandidates.has(idToUuid(fullSlug)) - ) - }) + /** + * 4️⃣ 二级匹配:完整 UUID 精确匹配 + */ + if (!post && fullSlug) { + post = props?.allPages?.find(p => { + return p?.id === fullSlug + }) + } /** - * 5️⃣ 非列表文章兜底(pageId) + * 5️⃣ 三级匹配:如果最后一段是 UUID,直接拉 Notion */ - if (!post && typeof lastSegment === 'string' && lastSegment.length >= 32) { + if ( + !post && + typeof lastSegment === 'string' && + /^[a-f0-9-]{32,36}$/i.test(lastSegment) + ) { try { post = await fetchPageFromNotion(lastSegment) } catch (e) { @@ -228,17 +224,14 @@ export async function resolvePostProps({ } /** - * 6️⃣ blockMap 兜底 + * 6️⃣ 如果拿到了 post,但没有 blockMap,则拉 block */ - if (post && post.id && !post?.blockMap) { +if (post?.id && !post?.blockMap) { try { - const rawBlockMap = await fetchNotionPageBlocks(post.id, source) - // Notion修改了数据格式再次做统一兼容 post.blockMap = adapterNotionBlockMap(rawBlockMap) - // 格式化内容,部分的样式字段格式在此处理 post.blockMap = { ...post.blockMap, block: formatNotionBlock(post.blockMap.block) @@ -268,6 +261,7 @@ export async function resolvePostProps({ return props } + /** * 将Notion数据转站点数据 * 这里统一对数据格式化 diff --git a/package.json b/package.json index a88c6db363e..3741d013463 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "notion-next", - "version": "4.9.3", + "version": "4.9.3.1", "homepage": "https://github.com/tangly1024/NotionNext.git", "license": "MIT", "engines": {