我有一个为数据库使用 NestJS 和 Prisma 的后端。我有一个保存文件位置的附件模型。目前,我保存了文件以及将其拉回所需的整个路径,就像这样
'http://127.0.0.1:5000/api/123.jpg'
。我想将其保存为'/123.jpg'
并让prisma在前面添加域字符串http://127.0.0.1:5000/api
以便服务器可以轻松移动到不同的域。
我有一个 for 循环,它遍历查询并根据需要添加域,但我必须为我站点中的每个关联和路由执行此操作。你们都知道 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?
}
已解决
我把@ConnorFogarty的回答放入/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;
}
//middleware to add server link to all requests for Attachments with 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'
}
Prisma 中间件 允许您在查询之前或之后运行代码。在您的情况下,您可以为
findMany
(或您运行的任何其他查询)定义一个中间件方法,该方法在附件路径之前插入服务器 url:
const prisma = new PrismaClient();
prisma.$use(async (params, next) => {
const server = "http://127.0.0.1:5000/api/";
if (params.model === "Attachment" && params.action === "findMany") {
// run findMany query
const result = await next(params);
// prepend server to thumbnail
const modified = result.map((res) => ({
...res,
thumbnail: server + res.thumbnail,
}));
return modified;
}
return next(params);
});