Heroku部署Next.js+Prisma项目QuotaGuard静态IP代理配置异常问题
核心逻辑错误
你当前的配置方向完全搞反了:http-proxy-middleware 配置的是代理用户访问你Next应用的入站请求,但你需要的是代理Next服务端(Prisma)主动发起的到SQL Server的出站请求,这是两个完全不同的场景,所以才会出现首页变成代理返回内容、QuotaGuard没抓到数据库请求的问题。
排查解决步骤
1. 回滚错误的server.js配置
首先删掉你现在加的代理中间件,先保证Next应用本身的入站请求能正常响应,不要把用户请求往QuotaGuard发。修正后的server.js基础配置如下:
// server.js 修正后基础版本 const express = require('express') const { parse } = require('url') const next = require('next') const dev = process.env.NODE_ENV !== 'production' const app = next({ dev }) const handle = app.getRequestHandler() app.prepare() .then(() => { const server = express() server.all('*', (req, res) => { const parsedUrl = parse(req.url, true) return handle(req, res, parsedUrl) }) server.listen(process.env.PORT, (err) => { if (err) throw err console.log(`> Ready on http://localhost:${process.env.PORT}`) }) }) .catch((err) => { console.log('Error:::::', err) })
部署后先验证首页、非API路由可以正常访问,排除入站请求的问题。
2. 配置Prisma通过QuotaGuard代理发起数据库请求
Prisma是直接发起TCP连接到SQL Server,不属于HTTP请求,不能用HTTP代理中间件,需要给Prisma配置SOCKS代理走QuotaGuard的通道:
- 安装依赖
npm install socks-proxy-agent
- 解析QuotaGuard代理地址并配置Prisma
QUOTAGUARDSTATIC_URL的格式为http://用户名:密码@代理主机:代理端口,你需要在Prisma初始化时解析该地址,绑定代理:
// prisma/client.js 示例 import { PrismaClient } from '@prisma/client' import { SocksProxyAgent } from 'socks-proxy-agent' import { parse } from 'url' // 解析QuotaGuard地址参数 const qgUrl = parse(process.env.QUOTAGUARDSTATIC_URL) const proxyHost = qgUrl.hostname const proxyPort = qgUrl.port const proxyAuth = qgUrl.auth // 初始化socks代理agent const agent = new SocksProxyAgent(`socks://${proxyAuth}@${proxyHost}:${proxyPort}`) // 给Prisma配置使用代理连接数据库 const prisma = new PrismaClient({ datasources: { db: { url: process.env.DATABASE_URL, config: { agent: agent } } } }) export default prisma
3. 最终验证
- 触发一次需要调用Prisma的API路由请求,查看QuotaGuard控制台是否有对应请求记录
- 确认QuotaGuard提供的两个静态出口IP已经被添加到客户SQL Server的白名单中
- 若仍有连接拒绝报错,优先检查代理地址解析是否正确、QuotaGuard服务授权是否正常
内容的提问来源于stack exchange,提问作者Al Sigman
相关产品推荐
相关产品推荐

