【问题标题】:"Cannot read property 'connect' of undefined\"无法读取未定义的属性\'connect\'
【发布时间】:2023-01-25 03:59:41
【问题描述】:

我在 pg.connect not defined 上收到错误。在处理程序模块中。


我正在尝试在 fastify 中使用 postgres 创建一个表。我有并处理处理路由和发送 API 请求的路由文件夹。当我点击 http://localhost:3000/initDB 路由时,错误提示

{
    "statusCode": 500,
    "error": "Internal Server Error",
    "message": "Cannot read property 'connect' of undefined"
}

这是我的表格模块,看起来像表格模块没有得到 fastify 实例我该如何解决这个问题。

const fastify = require("../server");

const Table = async (req, reply) => {
  await fastify.pg.connect(onConnect);
  function onConnect(err, client, release) {
    if (err) return reply.send(err);
    client.query(
      'CREATE TABLE IF NOT EXISTS "users" ("id" SERIAL PRIMARY KEY,"name" varchar(30),"lastname" varchar(30));',
      function onResult(err, result) {
        release();
        reply.send(err || result);
      }
    );
  }
};

module.exports = {
  Table,
};

路线文件,

我在这里处理过路线,

//const fastify = require("fastify");
const { Table } = require("./Handler/CreateTable");
const { GetUsers, PostUsers } = require("./Handler/Handler");
const CreateTable = {
  handler: Table,
};
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;

server.js 文件,

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"));

// Run the server
const start = () => {
  fastify.listen(3000, "0.0.0.0", (err, address) => {
    if (err) {
      fastify.log.error(err);
      process.exit(1);
    }
  });
};
start();

这是错误,请告诉我如何解决此错误。

pg连接报错待解决

在此输入

【问题讨论】:

    标签: javascript node.js postgresql docker fastify


    【解决方案1】:
    1. 检查 fastify 是否具有 pg 属性,通过 CTRL + 在导入它的行上单击它。应该打开 fastify 类/模块。在那里你可以检查类的属性和方法。

    2. 您将 onConnect 变量作为参数传递给函数。此变量未在任何地方定义:

      const fastify = require("../server");
      
      const Table = async (req, reply) => {
        await fastify.pg.connect(onConnect); // <= Check if you have defined onConnect variable anywhere.
        function onConnect(err, client, release) {
          if (err) return reply.send(err);
          client.query(
            'CREATE TABLE IF NOT EXISTS "users" ("id" SERIAL PRIMARY KEY,"name" varchar(30),"lastname" varchar(30));',
            function onResult(err, result) {
              release();
              reply.send(err || result);
            }
          );
        }
      };
      
      module.exports = {
        Table,
      };
      

    【讨论】:

    • onConnect 是下一行声明的函数名。
    • 您是否尝试过异步方法?
    【解决方案2】:

    一般来说,像这样导出全局变量是一种不好的做法。该应用程序将非常难以测试

    const fastify = require("fastify")({ logger: true });
    
    module.exports = fastify;
    

    所以,我建议阅读this article about it


    相反,关于您的问题,您需要将代码更改为:

    const Table = async function (req, reply) {
      await this.pg.connect(onConnect);
      // ...
    }
    

    请注意,当您使用命名函数(而不是匿名函数)this 上下文是 fastify 实例。

    您未定义是因为您引用的 fastify 变量尚未加载该装饰器,因此该文件中的 fastify.pg 返回 undefined

    最后,您应该安装 @fastify/postgres 而不是 fastify-postgress,因为最后一个已弃用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-06
      • 2020-10-30
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多