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

如何在Prisma查询返回时自动添加域名前缀?及中间件问题排查

Prisma 自动拼接附件域名前缀的解决方案

需求背景

我用 NestJS 和 Prisma 搭建后端,Attachment 模型用于存储文件路径。目前保存的是完整路由,比如 'http://127.0.0.1:5000/api/123.jpg',希望改为存储相对路径 '/123.jpg',让 Prisma 在查询时自动拼接域名前缀 http://127.0.0.1:5000/api,这样服务器迁移到不同域名时能更轻松。

之前我是通过循环遍历查询结果手动添加域名,但所有关联查询和路由里都要重复这个操作,想找 Prisma 层面的解决方案。

我的 schema.prisma 定义如下:

model Attachment {
  id                        Int                   @id @default(autoincrement())
  //is there a way to inject a domain url string in front of the string this sends out?
  thumbnail                 String?
  original                  String?
}

已尝试的方案

我编写了 Prisma 中间件,代码放在 /prisma/prisma.ts 中:

import { PrismaClient } from '@prisma/client';
import { APP_URL } from '../src/common/constants';

let prisma: PrismaClient;

if (process.env.NODE_ENV === 'production') {
  prisma = new PrismaClient();
} else {
  if (!global.prisma) {
    global.prisma = new PrismaClient();
  }
  prisma = global.prisma;
}

// 给 Attachment 的 original/thumbnail 字段自动拼接服务器地址
prisma.$use(async (params, next) => {
  console.log('params', params)
  if (params.model == 'Attachment' && params.action == 'findMany') {
    params.args.data.thumbnail = APP_URL + params.args.data.thumbnail;
  }

  return next(params)
})

export default prisma;

但控制台打印的 params 中不存在 params.args.data,日志内容如下:

params {
  args: { include: { avatar: true, addresses: true } },
  dataPath: [],
  runInTransaction: false,
  action: 'findMany',
  model: 'User'
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:21:01