Vercel Postgres+Nuxt Starter本地运行报missing_connection_string错误
解决Vercel Postgres本地运行连接问题
问题概述
使用Vercel Postgres Nuxt模板部署线上正常,但本地运行时API无法获取数据库数据,先后出现missing_connection_string和invalid_connection_string错误。
解决方案
1. 确保环境变量正确加载
- 确认
.env.local文件放在项目根目录,变量名无拼写错误,值的引号格式正确(比如POSTGRES_URL="xxx",引号内无多余空格)。 - 重启本地开发服务(停止
npm run serve后重新执行),确保环境变量被正确读取。
2. 修正数据库连接代码
问题原因
- 手动给
POSTGRES_URL追加?sslmode=require会破坏原有连接字符串结构,Vercel提供的POSTGRES_URL已包含pooling和SSL配置。 - 原代码中
seed函数使用顶层sql模板字符串,依赖全局环境变量,本地加载异常时会导致执行失败,需改为通过DB实例执行SQL。
修改后的完整get-users.ts代码
import { createPool, sql } from '@vercel/postgres'; async function seed(db: ReturnType<typeof createPool>) { const createTable = await db.sql` CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, image VARCHAR(255), "createdAt" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); `; console.log(`Created "users" table`); const users = await Promise.all([ db.sql` INSERT INTO users (name, email, image) VALUES ('Guillermo Rauch', 'rauchg@vercel.com', 'https://pbs.twimg.com/profile_images/1576257734810312704/ucxb4lHy_400x400.jpg') ON CONFLICT (email) DO NOTHING; `, db.sql` INSERT INTO users (name, email, image) VALUES ('Lee Robinson', 'lee@vercel.com', 'https://pbs.twimg.com/profile_images/1587647097670467584/adWRdqQ6_400x400.jpg') ON CONFLICT (email) DO NOTHING; `, db.sql` INSERT INTO users (name, email, image) VALUES ('Steven Tey', 'stey@vercel.com', 'https://pbs.twimg.com/profile_images/1506792347840888834/dS-r50Je_400x400.jpg') ON CONFLICT (email) DO NOTHING; `, ]); console.log(`Seeded ${users.length} users`); return { createTable, users, }; } export default defineEventHandler(async () => { const startTime = Date.now(); // 直接调用createPool,自动读取.env.local中的POSTGRES_URL const db = createPool(); try { const { rows: users } = await db.query('SELECT * FROM users'); const duration = Date.now() - startTime; return { users, duration }; } catch (error) { // @ts-ignore if (error?.message === `relation "users" does not exist`) { console.log( "Table does not exist, creating and seeding it with dummy data now..." ); // 传入db实例执行seed操作 await seed(db); const { rows: users } = await db.query('SELECT * FROM users'); const duration = Date.now() - startTime; return { users, duration }; } else { throw error; } } });
3. 额外排查点
- 在API路由中添加
console.log(process.env.POSTGRES_URL),启动服务后查看控制台,确认环境变量是否正确输出。 - 执行
npm update @vercel/postgres更新依赖至最新版本,避免版本兼容问题。
内容的提问来源于stack exchange,提问作者Awesom-o
相关产品推荐
相关产品推荐

