2016-02-25 24 views
5

W terminalu Postgresql mogę wpisać polecenie i uzyskać odpowiedź. Na przykład:Jak używać Node.js net.Socket do komunikowania się z bazą danych PostgreSQL jak w przypadku korzystania z terminala

# utwórz nową bazę danych bazy danych;

CREATE DATABASE

Przede wchodzę w terminalu polecenie „Utwórz newdatabase bazy danych;” Program bazy danych odpowiada „CREATE DATABASE”

staram się robić to samo rzeczy, ale przy użyciu sieci węzła .Gniazdo elektryczne. Innymi słowy, chcę wydać polecenia do serwera Postgresql, który mam uruchomiony na localhost: 5432 i uzyskać odpowiedź z powrotem przez gniazdo.

Mój program pomyślnie nawiązuje połączenie z serwerem PostgreSQL i pomyślnie opróżnia dane do jądra, ale nigdy nie otrzymuję odpowiedzi (odbiornik danych nigdy nie zostaje uruchomiony). Nie utworzono również nowej bazy danych.

Spojrzałem również na to, co dzieje się na wireshark. Wygląda na to, że gniazdo zostanie skonfigurowane. Widzę, że moje dane są wysyłane w postaci zwykłego tekstu. Serwer Postgresql wysyła następnie ACK FIN ACK. I ACK FIN ACK, a następnie ACK serwera PostgreSQL po raz ostatni. Więc wiem, że serwer postgresql nie wysyła żadnych danych z powrotem.

Moje pytanie brzmi: dlaczego serwer PostgreSQL ignoruje polecenie, które wysyłam, i dlaczego serwer PostgreSQL nie wysyła do mnie żadnych danych, nawet jeśli te dane są tylko błędem.

const net = require('net'); 
const BlueBird = require('bluebird'); 

BlueBird.coroutine(function*() { 

var host = "127.0.0.1"; 
var port = "5432"; 
var idle_timeout = 10000; 

var MySocket = new net.Socket(); 
MySocket.setTimeout(idle_timeout); 

var data = yield new Promise(

    function resolver(resolve, reject) { 

     MySocket.on('connect', function() { 
      var flushed = MySocket.write("create database newdatabase;", "utf8"); 
      console.log("Data flushed to kernel: " + flushed); 
     }); 

     MySocket.on('data', function (data) { 
      console.log(data); 
      resolve(data); 
     }); 

     MySocket.on('error', function (error) { 
      reject(error); 
     }); 

     MySocket.connect(port, host); 

    } 

    ); 

    return data; 

})() 
.then(function (data) { 

    console.log(data); 

    return data; 

}) 
.catch(function (error) { 

    console.error(error); 

}) 

Odpowiedz

2

psql jest (REPL) narzędzie wiersza polecenia, które wykonuje polecenia wpisane na jednej lub kilku liniach, i przetwarza je i wysyła go do bazy danych.

PostgreSQL nie mówi tym samym protokołem tekstowym przez gniazdo na porcie 5432. Możesz przeczytać więcej o protokole PostgreSQL w ich documentation.

pomocą modułu pg podłączyć do PostgreSQL z węzła, a nie kwerendy tam:

var pg = require('pg'); 
var conString = "postgres://username:[email protected]/database"; 

pg.connect(conString, function(err, client, done) { 
    if(err) { 
    return console.error('error fetching client from pool', err); 
    } 
    client.query('create database newdatabase', function(err, result) { 
    console.log('CREATE DATABASE'); 
    }); 
}  
+0

Twoja odpowiedź wyjaśnia moje zamieszanie i wskazuje mnie we właściwym kierunku. Przeczytałem część dokumentacji, którą połączyłeś i teraz zdajesz sobie sprawę, że protokół jest trochę bardziej zaangażowany niż to, co początkowo myślałem. Skończę używać modułu pg, ale jestem nowy w programowaniu stron internetowych i czułem, że najlepiej jest przyjrzeć się, jak działa pod maską. Dzięki bolav! – TheGreg

0

Rozszerzanie do odpowiedzi przez bolav, z prostszym podejściu poprzez pg-promise:

var pgp = require('pg-promise')(/*options*/); 
var db = pgp("postgres://username:[email protected]:port/database"); 

db.query("CREATE DATABASE NewDatabase") 
    .then(function (data) { 
     // success 
    }) 
    .catch(function (error) { 
     // error 
    });