2016-02-25 10 views
5

Nel terminale postgresql posso digitare un comando e ottenere una risposta. Ad esempio:Come utilizzare Node.js net.Socket per comunicare con il database Postgresql come si userebbe il terminale

# crea database nuovo database;

CREATE DATABASE

Sopra io entro nel terminale il comando “crea newdatabase banca dati;” Il programma di database risponde “CREATE DATABASE”

che sto cercando di fare la stessa cosa, ma con una rete nodo .Socket. In altre parole, voglio inviare comandi al server postgresql che ho in esecuzione su localhost: 5432 e ottenere una risposta tramite un socket.

Il mio programma configura una connessione con il server postgresql e scarica correttamente i dati nel kernel, ma non ottengo mai una risposta (il listener di dati non viene mai attivato). Il nuovo database non viene creato neanche.

Ho anche dato una rapida occhiata a cosa succede su wireshark. Sembra che il socket sia configurato. Vedo che i miei dati vengono inviati in chiaro. Il server postgresql invia quindi ACK FIN ACK. ACCO l'ACK FIN e quindi gli ACK postgresql del server un'ultima volta. Quindi so che il server postgresql non invia alcun dato indietro.

La mia domanda è, perché il server postgresql ignora il comando che invio e perché il server postgresql non mi invia alcun dato indietro, anche se quel dato è solo un errore.

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

}) 

risposta

2

psql è un (REPL) linea di comando che richiede un comando da inserire su una o più linee, e lo analizza, e lo invia al database.

PostgreSQL non sta parlando dello stesso protocollo textbased sul socket sulla porta 5432. È possibile leggere ulteriori informazioni sul protocollo PostgreSQL nel loro documentation.

Utilizzare il modulo pg per connettersi a Postgres con nodo e fare le query là:

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

La tua risposta chiarisce la mia confusione e mi indica la giusta direzione. Ho letto parte della documentazione che hai collegato e ora mi rendo conto che il protocollo è un po 'più complicato di quello che pensavo in origine. Finirò per usare il modulo pg, ma sono nuovo nella programmazione web e ho sentito che è meglio dare un'occhiata a come funzionano le cose sotto il cofano. Grazie bolav! – TheGreg

0

Estendere sulla risposta da bolav, con un approccio più semplice tramite 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 
    });