@prisma/client 尚未初始化。请运行“prismagenerate”并尝试再次导入

Lor*_*ord 29 node.js docker kubernetes prisma

我正在使用 prisma、postgres、docker、kubernets。

\n

npx prisma 迁移开发工作正常。

\n

npx prisma 生成产生以下输出:

\n
\xe2\x9c\x94 Generated Prisma Client (2.23.0) to ./node_modules/@prisma/client in 68ms\nYou can now start using Prisma Client in your code. Reference: https://pris.ly/d/client\n\nimport { PrismaClient } from '@prisma/client'\nconst prisma = new PrismaClient()\n
Run Code Online (Sandbox Code Playgroud)\n

但是当我尝试在我的路线文件中使用时产生错误:

\n

新路由.ts

\n
import { PrismaClient } from '@prisma/client';\n\nconst prisma = new PrismaClient();\n
Run Code Online (Sandbox Code Playgroud)\n

我的泊坞窗文件:

\n
FROM node:alpine\n\nWORKDIR /app\nCOPY package.json .\nRUN npm install --only=prod\nCOPY . .\n\nCMD ["npm", "start"]\n
Run Code Online (Sandbox Code Playgroud)\n

Cal*_*Gee 13

我知道这已被标记为已解决,但我只是想与感兴趣的人分享我的设置。

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"]

Run Code Online (Sandbox Code Playgroud)

包.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"
  }
}
Run Code Online (Sandbox Code Playgroud)

我在 Kubernetes 中运行这个。为了使数据库和迁移顺利进行,我运行了一个运行prisma migrate deploy.

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
Run Code Online (Sandbox Code Playgroud)

(这是一个实时服务,我刚刚复制并删除了所有非必要的内容)

我希望这对某人有用

  • @markokraljevic 据我所知,“npx prisma generated”仅创建“./prisma/ generated”目录。因此,将其包含在 Dockerfile 中是非常有意义的。 (2认同)

小智 10

我在开发时通常不会使用 docker 来实现此目的,但每次我更改某些内容schema.prisma并且必须使用npx prisma generate. 对我来说,解决方案是重新启动npm start再次运行的节点应用程序。也许如果你重新启动容器它可能会起作用。

如果您位于 kubernets pod 内部,则使用终端访问 pod,然后给出生成命令

kubectl exec -it pod_name sh
npx prisma generate
Run Code Online (Sandbox Code Playgroud)


小智 7

您忘记复制prisma目录,因为生成 Prisma 客户端需要该schema.prisma文件。您应该复制整个 prisma 目录,以防您还需要迁移。

您的最终 Dockerfile 应包含以下内容:

WORKDIR /app
COPY package*.json .
COPY prisma ./prisma/ 
RUN npm install --only=prod
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!这是正确的答案,只需在运行安装之前复制此文件夹即可运行 (2认同)

fcr*_*ier 7

这是解决这个问题的另一种方法。

由于.prismaprisma 客户端需要该文件夹,如下图或文档所示,一种方法是确保它与您的代码一起提供。您可以按如下方式执行此操作。

错误方式:发送生成的文件夹

您可能认为只需将 .prisma 文件夹的例外规则添加到您的图像中即可将生成的文件包含在图像中.dockerignore(注意感叹号)

node_modules/
!nodes_modules/.prisma
Run Code Online (Sandbox Code Playgroud)

但 prisma 使用的查询引擎对于每个操作系统都是不同的,因此您可能会遇到麻烦。

正确方法:用图像生成文件

只需RUN npx prisma generate在构建命令之前添加到 Dockerfile 中即可。这样,文件就会在映像创建过程中生成,您不必prisma generate在每个容器上运行该命令。这种方法的缺点是你的docker镜像会更大。如果这是一个问题,您可以尝试其他答案。

需要 .prisma 文件夹来引用生成的代码