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

Fastify中pg.connect未定义报错问题求助

问题解决:Fastify + PostgreSQL 500错误 "Cannot read property 'connect' of undefined"

错误原因

出现这个错误的核心原因是Table模块在导入server.js时,fastify-postgres插件还未完成异步注册,此时fastify.pg属性还未被初始化,导致访问fastify.pg.connect时触发undefined错误。

Fastify的插件注册是异步过程,而模块加载是同步的——当你在Table模块中直接require("../server")时,server里的fastify.register(require("fastify-postgres"))还处于等待执行的状态,并未完成插件的初始化,因此fastify.pg不存在。

解决方案

不要在Table模块中直接导入顶层的Fastify实例,而是通过Fastify请求对象的req.server属性获取已经完成插件注册的实例,同时将数据库操作改为async/await风格(更符合Fastify的异步设计)。

修改后的代码

1. Table模块(CreateTable.js)

const Table = async (req, reply) => {
  // 从请求对象获取已完成插件注册的Fastify实例
  const fastify = req.server;

  try {
    // 获取数据库连接客户端
    const client = await fastify.pg.connect();
    // 执行建表SQL
    const result = await client.query(
      'CREATE TABLE IF NOT EXISTS "users" ("id" SERIAL PRIMARY KEY,"name" varchar(30),"lastname" varchar(30));'
    );
    // 释放连接
    client.release();
    // 返回结果
    reply.send(result);
  } catch (err) {
    // 捕获并返回错误
    reply.send(err);
  }
};

module.exports = { Table };

2. 路由文件(routes.js)

无需修改,保持原代码即可:

const { Table } = require("./Handler/CreateTable");
const { GetUsers, PostUsers } = require("./Handler/Handler");

const getUsers = { handler: GetUsers };
const postUsers = { handler: PostUsers };

async function routes(fastify, options) {
  fastify.get("/initDB", Table);
  fastify.get("/users", getUsers);
  fastify.post("/users/create", postUsers);
}

module.exports = routes;

3. server.js

保持原代码的注册顺序(先注册postgres插件,再注册路由)即可:

const fastify = require("fastify")({ logger: true });
fastify.register(require("fastify-postgres"), {
  connectionString: `postgres://${process.env.POSTGRES_USER}:${process.env.POSTGRES_PASSWORD}@${process.env.POSTGRES_SERVICE}:${process.env.POSTGRES_PORT}/${process.env.POSTGRES_DB}`,
});

module.exports = fastify;
fastify.register(require("./routes"));

// 启动服务器
const start = () => {
  fastify.listen(3000, "0.0.0.0", (err, address) => {
    if (err) {
      fastify.log.error(err);
      process.exit(1);
    }
  });
};
start();

额外优化建议

  • 避免在模块级别直接依赖顶层Fastify实例,尽量通过req.server或路由注册时的闭包获取实例,保证插件初始化完成后再访问相关属性。
  • 统一使用async/await处理异步操作,避免回调嵌套,提升代码可读性和可维护性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:56:55