53 lines
1.5 KiB
JavaScript
53 lines
1.5 KiB
JavaScript
import fs from "fs";
|
||
import path from "path";
|
||
import matter from "gray-matter";
|
||
|
||
// 兼容 Nuxt 2(serverMiddleware)和 Nuxt 3(defineEventHandler)
|
||
const handler = (req, res) => {
|
||
try {
|
||
const newsDirectory = path.resolve("static/news");
|
||
|
||
if (!fs.existsSync(newsDirectory)) {
|
||
throw new Error("News directory does not exist");
|
||
}
|
||
|
||
const files = fs.readdirSync(newsDirectory);
|
||
if (files.length === 0) {
|
||
throw new Error("No news files found");
|
||
}
|
||
|
||
const newsList = files.map((file) => {
|
||
const filePath = path.join(newsDirectory, file);
|
||
const fileContent = fs.readFileSync(filePath, "utf-8");
|
||
const { data } = matter(fileContent);
|
||
|
||
return {
|
||
title: data.title || "Untitled",
|
||
date: data.date || "Unknown",
|
||
slug: file.replace(".md", ""),
|
||
};
|
||
});
|
||
|
||
res.setHeader("Content-Type", "application/json");
|
||
res.end(JSON.stringify(newsList));
|
||
} catch (error) {
|
||
console.error("API 错误:", error);
|
||
res.statusCode = 500;
|
||
res.end(JSON.stringify({ error: "Failed to load news", details: error.message }));
|
||
}
|
||
};
|
||
|
||
// Nuxt 3 使用 `defineEventHandler`
|
||
export default (typeof defineEventHandler !== "undefined"
|
||
? defineEventHandler(() => {
|
||
return new Promise((resolve) => {
|
||
const fakeRes = {
|
||
setHeader: () => {},
|
||
end: (data) => resolve(JSON.parse(data)),
|
||
statusCode: 200,
|
||
};
|
||
handler({}, fakeRes);
|
||
});
|
||
})
|
||
: handler);
|