Next.js+Postgres项目替换getDirectories为getFiles遇JSON解析错误
问题分析与解决方案
错误根源定位
这个SyntaxError: Unexpected end of JSON input错误来自Prisma客户端的JSON解析,说明传给Prisma的数据无法被正常序列化为JSON,或是数据库中存在损坏的JSON数据。结合你替换getDirectories为getFiles的操作,问题大概率出在新逻辑引入了非法数据或无关文件处理上。
具体排查与修复步骤
1. 过滤getFiles的目标文件,避免处理无关资源
你的getFiles函数当前会读取目录下所有文件,包括系统自动生成的文件(比如Mac的.DS_Store、Windows的Thumbs.db)或非JS文件,这些文件被处理后会生成无效的templateSlug,进而导致导入不存在的meta文件,或是传入非法数据给Prisma。
修改getFiles函数,只保留.js文件:
function getFiles(srcpath) { return fs .readdirSync(srcpath) // 先过滤出JS文件,避免处理无关资源 .filter(file => file.endsWith('.js')) .map((file) => path.join(srcpath, file)) .filter((filePath) => fs.statSync(filePath).isFile()) .map((file) => file.replace(/\.[^/.]+$/, '')); }
2. 验证导入的meta数据合法性
Prisma的JSON类型字段要求传入的数据必须是可序列化的JSON结构(不能包含函数、Symbol、undefined等非JSON类型)。检查你的模板meta文件(比如styles目录下的.js文件),确保导出的是纯对象,没有函数或其他无法序列化的内容:
// 错误示例:导出了函数,会导致Prisma序列化失败 export default { name: 'Test', getConfig: () => {} // 这种函数无法被序列化为JSON }; // 正确示例:仅导出可序列化的纯对象 export default { name: 'Test', config: { color: '#fff' } };
3. 增加错误捕获,定位具体出错的模板
在_initializeMeta的Prisma操作外层添加try-catch,打印具体出错的模板信息,快速定位问题文件:
async _initializeMeta() { for (const templateTypePath of getDirectories(TEMPLATES_BASE)) { const type = path.basename(templateTypePath); const basePath = path.join(TEMPLATES_BASE, type, 'styles'); if (!fs.existsSync(basePath)) continue; for (const templatePath of getFiles(basePath)) { const templateSlug = path.basename(templatePath); const meta = await this._getTemplateMeta(type, templateSlug); if (isEmpty(meta)) { console.warn(`✘ ${type}/${templateSlug} : meta.js not found`); continue; } try { await this.prisma.template.upsert({ where: { slug_type: { type, slug: templateSlug } }, update: { ...meta }, create: { type, slug: templateSlug, ...meta }, }); console.log(`✔ ${type}/${templateSlug} : meta initialized`); } catch (err) { // 打印具体错误和模板信息,快速定位问题 console.error(`❌ 处理模板 ${type}/${templateSlug} 失败:`, err); throw err; } } } }
4. 检查本地文件系统的差异
因为同学的设备正常,你的本地出错,可能是本地templates目录下存在额外的文件或损坏的meta文件:
- 删除本地
templates目录下的系统生成文件(.DS_Store、Thumbs.db等) - 对比同学的
templates目录,确认你的本地文件是否完整、无损坏
5. 重置Prisma客户端与数据库
如果上述步骤无效,尝试重置Prisma的状态:
- 运行
npx prisma generate重新生成客户端 - 运行
npx prisma migrate reset重置数据库(注意提前备份数据)
内容的提问来源于stack exchange,提问作者sahood CV
相关产品推荐
相关产品推荐

