问题:
- 管理后台编辑博客保存后,访问 /blog/{slug} 返回 500
- 用户上传封面图后前端不识别/裂图
根因:
1. admin [id].get.js 原样返回 DB 里的 tags 字符串 "[]",编辑页 loadItem
透传到 form.tags,保存时 JSON.stringify 再编码一次 → DB 写入 '"[]"'。
公开接口 JSON.parse 后得到字符串 "[]" 而非数组,前端 tags.join(',')
对字符串调用 → TypeError → SSR 500。
2. 上传接口保留中文文件名(\u4e00-\u9fa5 正则放行),Nginx/Nuxt 静态服务
对含中文 URL 处理不一致,静态请求 404。
修复:
- admin GET:tags 统一解析为数组返回
- admin POST/PUT:只接受数组,非数组写入空数组
- 公开 /api/content/blog|news:safeParseTags 兼容历史脏数据,
即使 DB 里是 '"[]"' / 非法 JSON 也保证输出数组
- upload.post.js:safeName 只保留 ASCII 字母数字,去除中文
- scripts/fix-articles-tags.mjs:一次性清理历史双重编码数据
35 行
1.0 KiB
JavaScript
35 行
1.0 KiB
JavaScript
import { useDB, schema } from '../../utils/db.js'
|
|
import { requireAdmin } from '../../utils/auth.js'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
requireAdmin(event)
|
|
|
|
const body = await readBody(event)
|
|
if (!body?.title || !body?.slug) {
|
|
throw createError({ statusCode: 422, message: '标题和 slug 不能为空' })
|
|
}
|
|
|
|
const db = useDB()
|
|
const now = new Date().toISOString()
|
|
|
|
const result = db.insert(schema.articles).values({
|
|
slug: body.slug,
|
|
title: body.title,
|
|
summary: body.summary || '',
|
|
content: body.content || '',
|
|
category: body.category || '',
|
|
type: body.type || 'news',
|
|
coverImage: body.coverImage || null,
|
|
author: body.author || '呼籁旅行',
|
|
tags: JSON.stringify(Array.isArray(body.tags) ? body.tags : []),
|
|
seoTitle: body.seoTitle || null,
|
|
seoDesc: body.seoDesc || null,
|
|
seoKeywords: body.seoKeywords || null,
|
|
published: body.published !== false ? 1 : 0,
|
|
createdAt: now,
|
|
updatedAt: now,
|
|
}).run()
|
|
|
|
return { success: true, id: result.lastInsertRowid }
|
|
})
|