簡體   English   中英

@prisma/client 還沒有初始化。 請運行“prisma generate”並嘗試再次導入

[英]@prisma/client did not initialize yet. Please run "prisma generate" and try to import it again

我正在使用 prisma、postgres、docker、kube.nets。

npx prisma 遷移開發工作。

和 npx prisma 生成低於 output 的產品:

✔ Generated Prisma Client (2.23.0) to ./node_modules/@prisma/client in 68ms
You can now start using Prisma Client in your code. Reference: https://pris.ly/d/client

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()

但是當我嘗試在我的路由文件中使用時產生錯誤:

新路線.ts

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

const prisma = new PrismaClient();

我的 docker 文件:

FROM node:alpine

WORKDIR /app
COPY package.json .
RUN npm install --only=prod
COPY . .

CMD ["npm", "start"]

我通常在開發時不使用 docker ,但是每次我在schema.prisma中更改某些內容並且必須使用 npx npx prisma generate時都會遇到這個問題。 我的解決方案是重新啟動運行npm start 也許如果您重新啟動容器,它可能會起作用。

如果您在 kubernets pod 中,則使用終端訪問 pod,然后給出 generate 命令

kubectl exec -it pod_name sh
npx prisma generate

我知道這已被標記為已解決,但我只是想與任何感興趣的人分享我的設置。

Dockerfile

# Build image
FROM node:16.13-alpine as builder
WORKDIR /app

# Not sure if you will need this
# RUN apk add --update openssl

COPY package*.json ./
RUN npm ci --quiet

COPY ./prisma prisma
COPY ./src src
RUN npm run build

# Production image

FROM node:16.13-alpine
WORKDIR /app
ENV NODE_ENV production

COPY package*.json ./
RUN npm ci --only=production --quiet

COPY --chown=node:node --from=builder /app/prisma /app/prisma
COPY --chown=node:node --from=builder /app/src /app/src

USER node

EXPOSE 8080
CMD ["node", "src/index.js"]

package.json

{
  "name": "example",
  "description": "",
  "version": "0.1.0",
  "scripts": {
    "generate": "npx prisma generate",
    "deploy": "npx prisma migrate deploy",
    "dev": "npm run generate && nodemon --watch \"src/**\" --ext \"js,json\" --exec \"node src/index.js\"",
    "build": "npm run generate",
    "start": "npm run build && node build/index.js"
  },
  "prisma": {
    "schema": "prisma/schema.prisma"
  },
  "dependencies": {
    "@prisma/client": "^3.6.0"
  },
  "devDependencies": {
    "@tsconfig/node16": "^1.0.2",
    "@types/node": "^16.11.12",
    "nodemon": "^2.0.15",
    "prisma": "^3.6.0"
  }
}

我在 Kubernetes 中運行它。 為了使數據庫和遷移順利進行,我運行了一個運行prisma migrate deploy的 initContainer 。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: EXAMPLE
spec:
  replicas: 1
  selector:
    matchLabels:
      app: EXAMPLE
  strategy:
    rollingUpdate:
      maxSurge: 100%
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: EXAMPLE
    spec:
      containers:
        image: DOCKER_IMAGE
        imagePullPolicy: IfNotPresent
        name: SERVICE_NAME
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
      initContainers:
      - command:
        - npm
        - run
        - deploy
        image: DOCKER_IMAGE
        imagePullPolicy: IfNotPresent
        name: database-migrate-deploy

(這是我剛剛復制並刪除了所有非必要內容的實時服務)

我希望這對某人有用

這是解決此問題的另一種方法。

由於 prisma 客戶端需要.prisma文件夾,如下圖或文檔中所示,另一種方法是確保它與您的代碼一起提供。 您可以按如下方式執行此操作。

錯誤方式:發送生成的文件夾

你會認為你可以通過將 .prisma 文件夾的例外規則添加到你的.dockerignore中來將生成的文件包含在圖像中(注意感嘆號)

node_modules/
!nodes_modules/.prisma

但是 prisma 使用的查詢引擎對於每個操作系統都是不同的,所以你可能會遇到麻煩。

正確方法:用圖片生成文件

只需在構建命令之前將RUN npx prisma generate添加到您的 Dockerfile。 這樣文件就在鏡像創建過程中生成了,你不必在每個容器上運行prisma generate命令。 這種方法的缺點是你的 docker 圖像會更大。 如果這是一個問題,您可以嘗試使用其他答案。

需要 .prisma 文件夾來引用生成的代碼

您忘記復制prisma目錄,因為生成 Prisma Client 需要schema.prisma文件。 您應該復制整個 prisma 目錄,以防您還需要遷移。

您的最終 Dockerfile 應包含以下內容:

WORKDIR /app
COPY package*.json .
COPY prisma ./prisma/ 
RUN npm install --only=prod

發生此錯誤是因為 docker 沒有安裝devDependencies ,這意味着它沒有選擇Prisma CLI

要解決此問題,您可以將prisma CLI package 添加到您的依賴項而不是devDependencies (確保運行npm install之后更新 package-lock.json)

對我來說,我只是在我的package.json中更改了scripts下的start ,以便我的應用程序在運行前生成 prisma 類型:

"start": "npx prisma generate && nodemon server.ts"

這對我有用——我只是想把它放在這里,供遇到同樣問題的任何人使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM