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

Posted

技术标签:

【中文标题】如何使用 Node.js net.Socket 与 Postgresql 数据库进行通信,就像使用终端一样【英文标题】:How to Use Node.js net.Socket To Communicate with Postgresql Database Like One Would Using Terminal 【发布时间】:2016-06-08 04:34:56 【问题描述】:

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

#创建数据库新数据库;

创建数据库

上面我在终端输入命令“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);

)

【问题讨论】:

【参考方案1】:

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

【讨论】:

您的回答消除了我的困惑,并为我指明了正确的方向。我已经阅读了您链接的一些文档,现在意识到该协议比我最初的想法要复杂一些。我最终将使用 pg 模块,但我是 Web 编程的新手,并且觉得最好看一下引擎盖下的工作原理。谢谢博拉夫!【参考方案2】:

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

【讨论】:

以上是关于如何使用 Node.js net.Socket 与 Postgresql 数据库进行通信,就像使用终端一样的主要内容,如果未能解决你的问题,请参考以下文章

Node.js实现WebSocket客户端

Node.js网络编程

西塔 js。如何与 Node JS 一起使用

Node.js 与 CouchDB 和 Backbone.js 一起使用,如何提供 json?

如何将 Node.js 中的 net 模块与 browserify 一起使用?

如何将 Asterisk ARI 与 socket.io 和 Node.js 一起使用