101 lines
2.6 KiB
TypeScript
Raw Permalink Normal View History

2025-09-16 17:19:58 +08:00
import { NextRequest, NextResponse } from 'next/server';
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
// 为静态导出生成参数
export async function generateStaticParams() {
// 返回所有可能的consultation ID
const consultationIds = ['cloud-migration', 'aws-optimization', 'security-audit'];
return consultationIds.map((id) => ({
id,
}));
}
const CACHE_DURATION = process.env.NODE_ENV === 'development' ? 0 : 60; // 开发环境10秒生产环境60秒
interface CacheStore {
[key: string]: {
data: any;
timestamp: number;
};
}
let cache: CacheStore = {};
function getCachedData<T>(key: string, fetchFn: () => T): T {
const now = Date.now();
const cached = cache[key];
if (cached && now - cached.timestamp < CACHE_DURATION * 1000) {
return cached.data;
}
const data = fetchFn();
cache[key] = {
data,
timestamp: now,
};
return data;
}
const docsDirectory = path.join(process.cwd(), 'data/consultations');
function getConsultationById(id: string, locale: 'zh-CN' | 'zh-TW' | 'en') {
const fileName = `${id}.${locale}.md`;
const fullPath = path.join(docsDirectory, fileName);
if (!fs.existsSync(fullPath)) {
return null;
}
const fileContents = fs.readFileSync(fullPath, 'utf8');
const { data } = matter(fileContents);
return {
id,
metadata: {
...data,
},
};
}
export async function GET(
request: NextRequest,
{ params }: { params: { id: string } }
) {
const { searchParams } = new URL(request.url);
const locale = (searchParams.get('locale') as 'zh-CN' | 'zh-TW' | 'en') || 'zh-CN';
const { id } = params;
try {
const cacheKey = `consultation:${id}:${locale}`;
const result = getCachedData(cacheKey, () => {
const consultation = getConsultationById(id, locale);
if (!consultation) {
return null;
}
return {
consultation,
};
});
if (!result) {
return NextResponse.json({ error: 'Consultation not found' }, { status: 404 });
}
// Set cache control headers
const response = NextResponse.json(result);
response.headers.set('Cache-Control', `public, s-maxage=${CACHE_DURATION}, stale-while-revalidate`);
return response;
} catch (error) {
console.error('Error fetching consultation:', error);
return NextResponse.json({ error: 'Failed to fetch consultation' }, { status: 500 });
}
}