You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的状态:

  1. 运行npx prisma generate重新生成客户端
  2. 运行npx prisma migrate reset重置数据库(注意提前备份数据)

内容的提问来源于stack exchange,提问作者sahood CV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:50:28