如何使用Node.js net.Socket与Postgresql数据库进行通信就像使用终端

时间:2016-02-25 11:59:58

标签: node.js database postgresql sockets

在postgresql终端中,我可以输入命令并获得响应。例如:

#create database new database;

创建数据库

上面我在终端输入命令“create database newdatabase;”数据库程序响应“CREATE DATABASE”

我正在尝试使用节点net.Socket做同样的事情。换句话说,我想向我在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 个答案:

答案 0 :(得分:2)

psql是一个(REPL)命令行工具,它接受在一行或多行上输入的命令,并对其进行解析,并将其发送到数据库。

PostgreSQL没有通过端口5432上的套接字说明相同的基于文本的协议。您可以在documentation中阅读有关PostgreSQL协议的更多信息。

使用pg模块连接到带节点的Postgres,并在那里进行查询:

var pg = require('pg');
var conString = "postgres://username:password@localhost/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');
  });
}    

答案 1 :(得分:0)

通过 bolav 扩展答案,通过pg-promise采用更简单的方法:

var pgp = require('pg-promise')(/*options*/);
var db = pgp("postgres://username:password@host:port/database");

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