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

如何在Vercel上连接React与PostgreSQL?附报错及代码求助

解决Vercel上React连接PostgreSQL的系列问题

错误信息

Uncaught (in promise) VercelPostgresError: VercelPostgresError - 'missing_connection_string': You did not supply a 'connectionString' and no 'POSTGRES_URL' env var was found.

现有代码

cndb.js

import { sql, db } from "@vercel/postgres";

export default async function handler(req, res) {
    const client = await db.connect({
        POSTGRES_URL: process.env.local.POSTGRES_URL,
    });
    try {
        await client.sql`CREATE TABLE Things (  Name varchar(255), Pass varchar(255) );`;
        const names = ["thinga", "thingb"];
        await client.sql`INSERT INTO Things (Name,Pass) VALUES (${names[0]},${names[1]});`;
    } catch (error) {
        return res.status(500).json({ error });
    }
    const things = await client.sql`SELECT * FROM Things;`;
    return res.status(200).json({ things });
}

page0.js

import { Link } from "react-router-dom";
import { useState } from "react";

import handler from "./api/cndb";

import "./page0.css";

export function Page0() {
    const [inputvalue, setinputvalue] = useState("");
    return (
        <>
            <div className="Circle" onClick={() => handler(null, null)}>
                submit
            </div>
        </>
    );
}

文件结构

项目根目录下包含:

  • api文件夹(内含cndb.js)
  • src文件夹(内含page0.js、page0.css等组件文件)
  • 根目录下的环境配置文件(.env.local、.env等)

问题修复步骤

1. 修复环境变量与数据库连接

  • 环境变量读取错误:process.env.local.POSTGRES_URL写法错误,环境变量直接挂载在process.env下,应改为process.env.POSTGRES_URL。
  • Vercel Postgres连接简化:db.connect()无需手动传入连接字符串,只要环境变量配置正确,库会自动读取POSTGRES_URL(或POSTGRES_URL_NON_POOLING)。
  • 环境变量配置规范:
    • 本地开发:根目录创建.env.local,添加POSTGRES_URL=你的Vercel Postgres连接字符串,保存后重启开发服务器。
    • Vercel部署:在项目后台的「Environment Variables」中添加POSTGRES_URL变量,值为Vercel Postgres提供的连接字符串。

修正后的cndb.js:

import { sql, db } from "@vercel/postgres";

export default async function handler(req, res) {
    const client = await db.connect();
    try {
        // 先检查表是否存在,避免重复创建报错
        await client.sql`
            CREATE TABLE IF NOT EXISTS Things (
                Name varchar(255),
                Pass varchar(255)
            );
        `;
        const names = ["thinga", "thingb"];
        await client.sql`INSERT INTO Things (Name,Pass) VALUES (${names[0]},${names[1]});`;
        const things = await client.sql`SELECT * FROM Things;`;
        return res.status(200).json({ things });
    } catch (error) {
        return res.status(500).json({ error: error.message });
    } finally {
        // 释放连接
        client.release();
    }
}

2. 修复API路由无法访问的问题

  • 若使用Next.js:API路由必须放在项目根目录的/api文件夹下,每个文件对应一个路由(如api/cndb.js对应/api/cndb),确保文件夹位置正确且文件名无拼写错误。
  • 若使用纯React(非Next.js):React本身无内置API路由,需通过Vercel Serverless Functions实现,此时api文件夹必须放在项目根目录,文件需符合Serverless规范(导出默认async函数接收req/res),部署后Vercel会自动识别该路由。

3. 修复前端调用API的方式

不能直接import并调用handler函数(它需要接收标准的req/res对象),应通过fetch发送HTTP请求调用API路由:

修正后的page0.js:

import { Link } from "react-router-dom";
import { useState } from "react";

import "./page0.css";

export function Page0() {
    const [inputvalue, setinputvalue] = useState("");

    const handleSubmit = async () => {
        try {
            const res = await fetch("/api/cndb", { method: "POST" });
            const data = await res.json();
            console.log(data);
        } catch (error) {
            console.error("请求失败:", error);
        }
    };

    return (
        <>
            <div className="Circle" onClick={handleSubmit}>
                submit
            </div>
        </>
    );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:37:40