如何使用Node.js net.Socket与Postgresql数据库通信就像使用terminal一样

在postgresqlterminal中,我可以键入一个命令并获得响应。 例如:

#创build数据库新数据库;

创build数据库

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

我正在尝试做同样的事情,但使用节点net.Socket。 换句话说,我想发布命令到我在localhost:5432上运行的postgresql服务器,并通过套接字获取响应。

我的程序成功地build立了与postgresql服务器的连接,并成功地将数据刷新到内核,但是我从来没有得到响应(数据监听器永远不会被触发)。 新数据库也不会被创build。

我也快速浏览了wireshark上发生的事情。 它看起来像sockets得到设置。 我看到我的数据以明文forms发送。 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); }) 

psql是一个(REPL)命令行工具,它接受一行或多行input的命令,并将其parsing并发送到数据库。

PostgreSQL在端口5432上的套接字上没有使用基于相同的基于文本的协议。您可以在其文档中阅读有关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'); }); } 

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