Node.js连接GCP Cloud SQL报错ReferenceError: Pool is not defined
报错原因
ReferenceError: Pool is not defined 是典型的未导入依赖类错误,具体触发点包括:
- 你使用了
pg库的Pool连接池类,但没有在代码顶部导入该类 - 代码中
pool、qResult变量未做声明就直接赋值,会触发隐式全局变量问题,严格模式下也会抛错 - 额外注意:你提到脚本是直接在HTML index页面引入的,前端浏览器环境无法直接运行Node.js的数据库驱动,且前端直连数据库会明文暴露账号密码,存在严重安全风险,这种写法本身就不可行。
解决步骤
- 安装PostgreSQL驱动依赖
在Node.js项目根目录执行命令安装官方pg驱动:
npm install pg
- 补全导入声明,修正服务端连接代码
数据库连接逻辑必须写在Node.js服务端代码中,文件顶部补全依赖导入和变量声明,修正后的参考代码如下:
// 顶部从pg库导入Pool类 const { Pool } = require('pg'); let pool; let qResult; // 用async函数包裹异步逻辑,避免回调嵌套 async function initDbConnection() { try { pool = new Pool({ user: "postgres", host: "/cloudsql/sfmcsms-d-970229:europe-west1:dsi-sfmc-sms-database", database: "postgres", password: "dsi-sfmc-sms-database", port: 5432, // 端口字段传数字类型,不要传字符串 }); // 主动建立测试连接验证连通性 const testClient = await pool.connect(); console.log("Connection successful!"); testClient.release(); // 测试完成后释放连接 // 执行查询 const queryRes = await pool.query("select * from ConfigParameter;"); qResult = queryRes.rows; console.log(qResult); // 后续在这里编写接口逻辑,把查询结果返回给前端 } catch (err) { console.log("Failed to start pool", err); } } initDbConnection();
- 调整前后端交互逻辑
- 服务端查询到配置表数据后,封装成HTTP接口(可以用express之类的web框架快速实现)
- 前端HTML页面的脚本只负责调用这个接口拿到数据,再完成下拉组件的选项填充,不要在前端写任何数据库连接相关代码
- 本地调试GCP Cloud SQL连接时,需要启动Cloud SQL Auth Proxy做端口转发,本地调试阶段host填
127.0.0.1即可,等服务部署到GCP对应环境后再换成Cloud SQL的unix套接字路径,同时要保证部署服务的账号拥有Cloud SQL Client权限。
内容的提问来源于stack exchange,提问作者B. Palma
相关产品推荐
相关产品推荐

