如何使用动态密钥从 prisma 调用资源?

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

我正在尝试使用更通用的方法从 prisma 获取数据,我的函数目前如下所示:

import { Prisma, PrismaClient } from '@prisma/client';
import { NextApiRequest, NextApiResponse } from 'next';

const prisma = new PrismaClient();

const getAllOfResource = async (resourceName: Prisma.ModelName) => {
  const resource = prisma[resourceName as Prisma.ModelName];
  if (!resource.findMany) throw Error('Error: findMany not found, does resource exist?');
  return await resource.findMany();
};

const validateResourceTypeExists = (resourceType: unknown): resourceType is Prisma.ModelName => {
  return typeof resourceType === 'string' && Object.keys(Prisma.ModelName).includes(resourceType);
};

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  const requestedResource = req.query.id;
  if (!validateResourceTypeExists(requestedResource)) {
    res.status(500).json({
      message: 'Please use a valid resource type',
    });
  } else {
    const resource = await getAllOfResource(requestedResource);
    return res.status(200).json(resource);
  }
}

但是,当在资源上调用

findMany()
时,它给了我一个错误:

This expression is not callable.
  Each member of the union type '(<T extends mediaFindManyArgs<DefaultArgs>>(args?: SelectSubset<T, mediaFindManyArgs<DefaultArgs>> | undefined) => PrismaPromise<...>) | (<T extends booksFindManyArgs<...>>(args?: SelectSubset<...> | undefined) => PrismaPromise<...>)' has signatures, but none of those signatures are compatible with each other

我不知道为什么这不行,因为

Prisma.ModelName
中的所有内容都应该有
findMany
方法。我是否错过了更好的类型,或者我的做法是否存在根本性错误?

我已经尝试了一些方法,但我认为这很可能是我不理解它是如何工作的。

typescript next.js prisma
1个回答
0
投票

TypeScript 无法保证资源在所有情况下都包含“findMany”方法,因此会发生此异常。 为了防止这种情况,您可以预设资源类型:

  const resource: Prisma.PrismaClient['resourceName'] = prisma[resourceName as Prisma.ModelName];
© www.soinside.com 2019 - 2024. All rights reserved.