Как мне сделать свой собственный модуль CRUD, используя node-postgres? - PullRequest
0 голосов
/ 10 июня 2019

При вызове ajax на сервер NodeJS (не localhost) он ничего не возвращает.При выполнении вызова ajax NodeJS показывает результаты в моей консоли NodeJS (ssh).NodeJS аварийно завершает работу через 10-15 секунд после вызова ajax с ошибкой.

Я пытался использовать Pool, но я не понимаю этого.

frontend

"use strict";
var btn = document.getElementById('button');

function ajax(){
  let req = new XMLHttpRequest();
  req.onreadystatechange = function(){
    if( this.readyState === 4 && this.status === 200){
      let data = JSON.parse( this.responseText );
      console.log(data);
    }
  };
  req.open("GET", "/ajax/", true);
  req.send();
};

btn.addEventListener("click", (e)=>{
  e.preventDefault();
  ajax();
});

backend (nodejs)

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

const db = new Client({
  user: "x",
  password: "x",
  host: "x",
  port: 123,
  database: "abc",
  ssl: true
});

module.exports = {
  async select( sql ){
    try{
      await db.connect();
      console.log("Connected to DB");
      const result = await db.query( sql );
      console.table(result.rows); // <-- Shows the data i want to send back.
      return JSON.stringify(result.rows);
    }

    catch(ex){
      console.log("We messed up! " + ex);
    }

    finally{
      await db.end();
      console.log("DB connection closed");
    }
  }
};

Я ожидаю, что вызов ajax вернет данные из базы данных postgres.Те же данные, которые я вижу в своей консоли nodeJS.

Error: Client has already been connected. You cannot reuse a client.
events.js:177
      throw er; // Unhandled 'error' event
      ^

Error: This socket has been ended by the other party
    at TLSSocket.writeAfterFIN [as write] (net.js:407:14)
    at Connection.end 
 code: 'EPIPE'

1 Ответ

1 голос
/ 10 июня 2019

Чтобы использовать Client из модуля pg, необходимо создать новый экземпляр Client для каждого запроса к базе данных, поскольку каждый клиент представляет разных пользователей и соединения.Таким образом, вы должны рассматривать их как одноразовый экземпляр использования:

const {Client} = require('pg');
const dbConn = {
  user: "x",
  password: "x",
  host: "x",
  port: 123,
  database: "abc",
  ssl: true
};

module.exports = {
  async select( sql ){
    const db = new Client(dbConn); // <-- Create new Client for every call

    try{
      await db.connect();
      console.log("Connected to DB");
      const result = await db.query( sql );
      console.table(result.rows); // <-- Shows the data i want to send back.
      return JSON.stringify(result.rows);
    }

    catch(ex){
      console.log("We messed up! " + ex);
    }

    finally{
      await db.end();
      console.log("DB connection closed");
    }
  }
};

В вашем случае, также как , рекомендованный в документации , вы бы хотели Пул .По сути, это то же самое, что и Клиент , за исключением того, что теперь Пул будет управлять клиентами для вас внутри.

С вашей точки зрения, на самом деле это не сильно отличается от клиента, за исключением того, что он намного проще.

const {Pool} = require('pg');

// Notice here
const db = new Pool({
  user: "x",
  password: "x",
  host: "x",
  port: 123,
  database: "abc",
  ssl: true
});

module.exports = {
  async select( sql ){
    try
      const result = await pool.query( sql ); // <-- Notice here
      console.table(result.rows); // <-- Shows the data i want to send back.
      return JSON.stringify(result.rows);
    }

    catch(ex){
      console.log("We messed up! " + ex);
    }

    /* No need to release client as Pool does it for you internally */
  }
};
...