node-postgres:Postgres客户端仍在client.end之后连接吗?

问题描述

我通过node-postgres与我的postgres数据库建立了简单的连接,如下所示:

let { Pool,Client } = require("pg");

let postgres = new Client({
  host: "localhost",port: 5432,user: "postgres",password: "Thisisngo1995!",});

module.exports = postgres;

我通过使用以下代码触摸端点来测试连接:

let postgres = require("../../databases/postgres");

exports.postgres_get_controller = (req,resp) => {
  console.log("Reached Here");

  postgres
    .connect()
    .then(() => console.log("connected"))
    .catch((err) => console.error("connection error",err.stack))
    .then(() =>
      postgres.end((err) => {
        console.log("postgres disconnected");
      })
    );

我得到了所需的console.log,表明客户端已连接,然后断开连接。但是,每当刷新页面时,我都会收到以下消息:

enter image description here

为什么会这样?

解决方法

客户端不可重用。每当您尝试重新连接已使用的客户端时,这都会更改客户端引发错误。创建它们很便宜:只需实例化一个新的(或使用池)

请参见此comment和此issue

解决方案是为每个请求创建pg客户端。

ccontroller.js

let { Client } = require('pg');

exports.postgres_get_controller = (req,resp) => {
  console.log('Reached Here');
  let postgres = new Client({
    host: 'localhost',port: 5430,database: 'node-sequelize-examples',user: 'testuser',password: 'testpass',});

  postgres
    .connect()
    .then(() => console.log('connected'))
    .catch((err) => console.error('connection error',err.stack))
    .then(() =>
      postgres.end((err) => {
        console.log('postgres disconnected');
        if (err) {
          console.log('error during disconnection',err.stack);
        }
      }),);

  resp.sendStatus(200);
};

server.js

const express = require('express');
const { postgres_get_controller } = require('./controller');

const app = express();
const port = 3000;
app.get('/',postgres_get_controller);

app.listen(port,() => console.log('server start'));

多次刷新页面以击中端点并执行控制器代码后的日志:

server start
Reached Here
connected
postgres disconnected
Reached Here
connected
postgres disconnected
Reached Here
connected
postgres disconnected
Reached Here
connected
postgres disconnected
Reached Here
connected
postgres disconnected
Reached Here
connected
postgres disconnected
Reached Here
connected
postgres disconnected

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...