如何使用 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 与 CouchDB 和 Backbone.js 一起使用,如何提供 json?