Как импортировать сгенерированный PrismaClient из папки node_modules?

Рейтинг: 0Ответов: 1Опубликовано: 18.04.2023

Дано.

В бэкенд-приложении есть два микросервиса trainings(тренировки) и gyms(спортивные залы). Каждый микросервис использует свою БД(PostgreSQL). Взаимодействие с БД осуществляется с помощью PrismaORM. Приложение строится с использованием монорепозитория, для всех микросервисов используется единая папка node_modules/ Мне нужно сгенерировать 2 PrismaClient-а (от микросервисов trainings и gyms) в эту папку node_modules.

Для этого я сделал следующее:

  • в микросервисе trainings, в файле schema.prisma я указал путь куда будет генерироваться клиент
    generator client {
      provider = "prisma-client-js"
      output = "../../../node_modules/.prisma/client-trainings"
    }
  • тоже самое я сделал для микросервиса gyms (в поле output путь до папки куда генерируется клиент)
    generator client {
      provider = "prisma-client-js"
      output = "../../../node_modules/.prisma/client-gyms"
    }

Оба клиента были успешно сгенерированы после того как я вызвал команды:

  • nx run trainings:db-generate;
  • nx run gyms:db-generate;

На всякий случай укажу какие действия вызывают эти команды. Данные команды у меня описаны в файле project.json:

"db-generate": {
      "executor": "nx:run-commands",
      "options": {
        "command": "npx prisma generate --schema ./prisma/schema.prisma",
        "cwd": "apps/gyms"
      }
 },

А вот теперь собственно сам вопрос. Когда у меня был 1 микросервис trainings я в файлы, где описывал логику приложения, импортировал PrismaClient следующим образом:

import { PrismaClient } from '@prisma/client';

Но после того как я добавил второй клиент от микросервиса gyms сокращённая запись не работает, например:

  • import { PrismaClient } from '@prisma/client-gyms'; или
  • import { PrismaClient } from '@prisma/client-trainings';

Появляется ошибка - Cannot find module '@prisma/client-gyms' or its corresponding type declarations.

Поэтому я вынужден импортировать PrismaClient полностью прописывая путь до него, например вот так:

  • import { PrismaClient } from '../../../../../node_modules/.prisma/client-gyms'; или
  • import { PrismaClient } from '../../../../../node_modules/.prisma/client-trainins';

Как можно избавиться от такой длинной записи???


И второй вопрос, он даже более важный чем предыдущий. Оба микросервиса (trainings и gyms) перестали запускаться, когда я вызываю следующие команды:

  • nx run trainins:serve,
  • nx run gyms:serve

Данные команды у меня описаны в файле project.json:

"serve": {
      "executor": "@nrwl/js:node",
      "options": {
        "buildTarget": "gyms:build"
      },
      "configurations": {
        "production": {
          "buildTarget": "gyms:build:production"
        }
      }
},

Каждый раз когда я вызываю эту команду у меня выскакивает следующая ошибка: [Nest] 1556 - 17.04.2023, 19:17:15 ERROR [ExceptionHandler] ENOENT: no such file or directory, open 'C:\Users\simae\Desktop\FitFriends\fit-friends\dist\apps\gyms\schema.prisma'

У меня есть подозрение, что данная проблема связана с тем что у меня теперь два PrismaClient-a. Во всяком случае до того когда у меня был один микросервис и один PrismaClient таких проблем не было.

Не уверен что мне тут смогут помочь, но на всякий случай опубликую вопрос, попытка не пытка :) Сам я уже с этим вопросом вожусь больше суток, перерыл всю доку по призме, но так и не смог разобраться. К сожалению опыта и знаний пока не достаточно.

Ответы

▲ 0

Опытные товарищи подсказали мне в чём проблема. На всякий случай опубликую здесь ответ. Проблема специфичная, но тем не менее может возникнуть у тех, кто будет работать с микросервисами.

В файле schema.prisma в поле output нужно было использовать @ вместо точки, таким образом:

output = "../../../node_modules/@prisma/client-trainings"

После этого уже можно обращаться к клиенту так:

import { PrismaClient } from '@prisma/client-trainings';

Ну и проблема с запуском микросервисов после внесённых изменений решилась.