如何在 prisma 的查询返回前添加一个字符串?

问题描述 投票:0回答:1

我有一个为数据库使用 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'
}
javascript typescript nestjs multer prisma
1个回答
3
投票

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);
});
© www.soinside.com 2019 - 2024. All rights reserved.