2016-02-25 13 views
5

Trong thiết bị đầu cuối postgresql tôi có thể gõ lệnh và nhận phản hồi. Ví dụ:Làm thế nào để sử dụng Node.js net.Socket Để giao tiếp với cơ sở dữ liệu Postgresql Giống như người ta sử dụng thiết bị đầu cuối

# tạo cơ sở dữ liệu mới cho cơ sở dữ liệu;

CREATE DATABASE

Trên đây tôi nhập vào trong nhà ga lệnh “tạo cơ sở dữ liệu newdatabase;” Chương trình cơ sở dữ liệu đáp ứng “CREATE DATABASE”

Tôi cố gắng để làm như vậy điều nhưng sử dụng một mạng lưới nút .Ổ cắm. Nói cách khác, tôi muốn đưa ra các lệnh tới máy chủ postgresql mà tôi đã chạy trên localhost: 5432 và nhận được phản hồi qua một socket.

Chương trình của tôi thiết lập thành công kết nối với máy chủ postgresql và xóa thành công dữ liệu vào hạt nhân, nhưng tôi chưa bao giờ nhận được phản hồi (trình nghe dữ liệu không bao giờ bị phát). Cơ sở dữ liệu mới cũng không được tạo ra.

Tôi cũng xem nhanh những gì xảy ra trên wireshark. Có vẻ như ổ cắm được thiết lập. Tôi thấy dữ liệu của tôi được gửi trong văn bản rõ ràng. Máy chủ postgresql sau đó gửi ACK FIN ACK. Tôi ACK FIN ACK và sau đó máy chủ postgresql ACK một lần cuối cùng. Vì vậy, tôi biết rằng máy chủ postgresql không gửi lại bất kỳ dữ liệu nào.

Câu hỏi của tôi là, tại sao máy chủ postgresql bỏ qua lệnh tôi gửi và tại sao máy chủ postgresql không gửi cho tôi bất kỳ dữ liệu nào, ngay cả khi dữ liệu đó chỉ là lỗi.

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

}) 

Trả lời

2

psql là công cụ dòng lệnh (REPL) có lệnh được nhập trên một hoặc nhiều dòng và phân tích cú pháp và gửi nó vào cơ sở dữ liệu.

PostgreSQL không nói cùng giao thức textbased trên socket trên cổng 5432. Bạn có thể đọc thêm về giao thức PostgreSQL trong documentation của chúng.

Sử dụng các module pg để kết nối với Postgres với nút, và thực hiện các truy vấn có:

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

Câu trả lời của bạn xóa bỏ sự nhầm lẫn của tôi và chỉ cho tôi đi đúng hướng. Tôi đã đọc qua một số tài liệu bạn đã liên kết và bây giờ nhận ra rằng giao thức có liên quan nhiều hơn một chút so với những gì tôi đã nghĩ ban đầu. Tôi sẽ kết thúc bằng cách sử dụng các mô-đun pg, nhưng tôi mới để lập trình web và cảm thấy nó tốt nhất để có một chút nhìn vào cách mọi thứ hoạt động dưới mui xe. Cảm ơn bolav! – TheGreg

0

Mở rộng trên câu trả lời của bolav, với một cách tiếp cận đơn giản hơn qua 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 
    }); 
Các vấn đề liên quan