2016-02-25 12 views
5

用いたものだろうと同じように、PostgreSQLデータベースと通信するためのNode.js net.Socketを使用するためにはどのようにコマンドを入力し、応答を取得することができます。たとえば:PostgreSQLのターミナルでは、ターミナル

#は、データベースに新しいデータベースを作成します。

私はコマンドは、端末に入力した上DATABASE

の作成「データベースnewdatabaseを作成し、」データベースプログラムは、私は同じことをやろうとしているが、ノードのネットを使用しています

の「CREATE DATABASEの」応答。ソケット。言い換えれば、localhost:5432上で実行しているpostgresqlサーバーにコマンドを発行し、ソケット経由で応答を返したいとします。

私のプログラムが正常にPostgreSQLサーバとの接続を設定し、成功したカーネルにデータをフラッシュし、私は、応答を取得することはありません(データ・リスナーは、解雇れることは決してありません)。新しいデータベースも作成されません。

私はまた、wiresharkの上で何が起こるかをざっと見ていました。ソケットがセットアップされたようです。私は私のデータが平文で送られるのを見ます。 postgresqlサーバは、ACK FIN ACKを送信します。私はACK FIN ACKを返し、その後postgresqlサーバは最後にACKを1回送信します。ですから、私は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は、1つまたはいくつかの行に入力されたコマンドを受け取り、それを解析し、データベースに送信し(REPL)コマンドラインツールです。

PostgreSQLは、ポート5432のソケットを介して同じテキストベースのプロトコルについて話していません。PostgreSQLプロトコルの詳細については、documentationを参照してください。

がクエリノードではPostgresへの接続、および行うにpgモジュールを使用します。pg-promiseを経由して簡単な方法で、bolavによって

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モジュールを使用して終了しますが、私は、Webプログラミングに新しいですし、物事がフードの下でどのように機能するかで少し見てみると、それ最善を感じました。ありがとう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 
    });