2016-02-25 27 views
5

在postgresql終端中,我可以輸入命令並獲得響應。例如:如何使用Node.js net.Socket與Postgresql數據庫通信就像使用終端一樣

#create database new database;

CREATE DATABASE

在上面,我在終端的命令進入「創建數據庫newdatabase;」數據庫程序響應「CREATE DATABASE」

我試圖做同樣的事情,但使用節點網。插座。換句話說,我想向我在localhost:5432上運行的postgresql服務器發出命令,並通過套接字獲取響應。我的程序成功地建立了與postgresql服務器的連接,併成功地將數據刷新到內核,但我從來沒有得到響應(數據偵聽器永遠不會被觸發)。新數據庫也不會被創建。

我也快速瀏覽了wireshark上發生的事情。它看起來像插座得到設置。我看到我的數據以明文形式發送。 postgresql服務器然後發送ACK FIN ACK。我確認FIN ACK,然後postgresql服務器最後一次確認。所以我知道postgresql服務器不會發回任何數據。

我的問題是,爲什麼postgresql服務器會忽略我發送的命令,爲什麼postgresql服務器不會向我發回任何數據,即使這些數據只是一個錯誤。

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

}) 

回答

2

psql是一個(REPL)的命令行工具這需要在一個或幾個行輸入的命令,並對其進行解析,並將其發送到數據庫。

PostgreSQL在端口5432上的套接字上沒有使用相同的基於文本的協議。您可以在他們的documentation中閱讀有關PostgreSQL協議的更多信息。

使用pg模塊與節點連接的Postgres,並做了詢問有:由bolav通過pg-promise

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

你的回答清除了我的困惑,並指出我朝着正確的方向前進。我已經閱讀了一些鏈接的文檔,現在認識到協議比我原先想的要多一點。我將最終使用pg模塊,但我對網絡編程不熟悉,並且最好稍微查看一下引擎蓋下的工作情況。謝謝bolav! – TheGreg

0

對答案擴展,具有更簡單的方法:

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 
    }); 
相關問題