You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prisma create()调用报错:未找到DATABASE_URL环境变量

问题描述

测试请求处理函数时,调用prisma.sdk_error.create()出现「未找到DATABASE_URL环境变量」错误,但其他类似create操作可正常连接数据库,同时Jest测试出现超时问题。

相关代码

Prisma模型(schema.prisma)

model sdk_error {
  view_id   String   @id
  message   String
  timestamp DateTime
}

请求处理函数(error.ts)

const errorIngestionHandler = async (req: Request, res: Response) => {
  const time = new Date('November 8, 2022, 12:00:00');
  const errorModel = await prisma.sdk_error.create({
    data: {
      view_id: '1234',
      message: 'this is a test',
      timestamp: time,
    },
  });

  const ret = await prisma.sdk_error.findUnique({
    where: {
      view_id: errorModel.view_id,
    },
  });

  res.send(ret);
};

错误信息

DATABASE_URL未找到错误

Invalid `prisma.sdk_error.create()` invocation in
C:\Users\cmb\vlly\vlly-api\src\v1\ingestion\error.ts:6:45

  3 //Errors
  4 const errorIngestionHandler = async (req: Request, res: Response) => {
  5   const time = new Date('November 8, 2022, 12:00:00');
→ 6   const errorModel = await prisma.sdk_error.create(
error: Environment variable not found: DATABASE_URL.
  -->  schema.prisma:12
   |
11 |   provider = "mysql"
12 |   url      = env("DATABASE_URL")

Validation Error Count: 1

  4 | const errorIngestionHandler = async (req: Request, res: Response) => {
  5 |   const time = new Date('November 8, 2022, 12:00:00');
> 6 |   const errorModel = await prisma.sdk_error.create({
    |                      ^
  7 |     data: {
  8 |       view_id: '1234',
  9 |       message: 'this is a test',

  at RequestHandler.handleRequestError (node_modules/@prisma/client/runtime/index.js:34316:13)
  at node_modules/@prisma/client/runtime/index.js:34737:25
  at PrismaClient._executeRequest (node_modules/@prisma/client/runtime/index.js:35301:22)
  at PrismaClient._request (node_modules/@prisma/client/runtime/index.js:35273:16)
  at errorIngestionHandler (src/v1/ingestion/error.ts:6:22)

Jest测试超时错误

● API Endpoint test › creates new row in error table

thrown: "Exceeded timeout of 5000 ms for a test.
Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test."

  20 |       .expect('Not implemented');
  21 |   });
> 22 |   it('creates new row in error table', async () => {
     |   ^
  23 |     const time =  new Date('November 8, 2022, 12:00:00');
  24 |     const expected = {
  25 |       view_id: '1234',

  at src/v1/ingestion/error.test.ts:22:3
  at Object.<anonymous> (src/v1/ingestion/error.test.ts:8:1)

解决方案

  • 确保测试环境加载环境变量:Jest默认不会自动读取.env文件,在测试文件顶部添加require('dotenv').config()(或ES模块的import dotenv from 'dotenv'; dotenv.config()),确保DATABASE_URL能被Prisma读取到。如果使用了不同的环境配置文件(如.env.test),要指定路径:dotenv.config({ path: '.env.test' })。
  • 检查Prisma客户端实例:确保项目中只创建一个PrismaClient实例并全局复用,避免因多次实例化导致环境变量未加载的情况。比如创建prisma/client.ts导出单例:
    import { PrismaClient } from '@prisma/client';
    
    const prisma = global.prisma || new PrismaClient();
    
    if (process.env.NODE_ENV !== 'production') global.prisma = prisma;
    
    export default prisma;
    
  • 修复Jest超时问题:超时是因为数据库错误导致请求处理函数挂起,解决DB连接问题后超时会自动消失。若需临时调整,可在测试用例中添加jest.setTimeout(10000),或在jest.config.js中设置testTimeout: 10000。
  • 规范日期格式:代码中使用的日期字符串格式虽然能被解析,但建议使用ISO标准格式(如new Date('2022-11-08T12:00:00')),避免潜在的跨环境解析问题。

内容的提问来源于stack exchange,提问作者macman926

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:35:49