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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:15:08