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
相关产品推荐
相关产品推荐

