docker “无法读取未定义的属性'connect'

9gm1akwq  于 2023-01-25  发布在  Docker
关注(0)|答案(2)|浏览(127)

我在处理器模块中得到一个关于未定义的连接的错误。
我尝试在fastify中使用postgres创建一个表。我有和handle routes文件夹,用于处理路由和发送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;

服务器. 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连接错误
在此键入

ego6inou

ego6inou1#

1.检查fastify是否有pg属性,方法是按住CTRL键并单击导入行。fastify类/模块应该打开。在那里可以检查类的属性和方法。
1.您正在将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,
};
nvbavucw

nvbavucw2#

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

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,所以会出现undefined。
最后,您应该安装@fastify/postgres而不是fastify-postgress,因为最后一个已经过时了。

相关问题