如何像使用终端一样使用Node.js net.Socket与Postgresql数据库通信
在postgresql终端中,我可以键入命令并获得响应。例如: #创建新数据库 创建数据库 在上面,我在终端中输入命令“createdatabasenewdatabase”;数据库程序响应“createdatabase” 我正在尝试做同样的事情,但使用node net.Socket。换句话说,我想向在localhost:5432上运行的postgresql服务器发出命令,并通过套接字获得响应 我的程序成功地建立了与postgresql server的连接,并成功地将数据刷新到内核,但我从未得到响应(数据侦听器从未被触发)。新数据库也不会被创建 我还快速查看了wireshark上发生的情况。看起来套接字已经安装好了。我看到我的数据以明文形式发送。然后,postgresql服务器发送一个ACK FIN ACK。我确认FIN ACK,然后postgresql server最后一次确认。所以我知道postgresql server不会发送任何数据回来 我的问题是,为什么postgresql server忽略我发送的命令,为什么postgresql server不向我发送任何数据,即使这些数据只是一个错误如何像使用终端一样使用Node.js net.Socket与Postgresql数据库通信,node.js,database,postgresql,sockets,Node.js,Database,Postgresql,Sockets,在postgresql终端中,我可以键入命令并获得响应。例如: #创建新数据库 创建数据库 在上面,我在终端中输入命令“createdatabasenewdatabase”;数据库程序响应“createdatabase” 我正在尝试做同样的事情,但使用node net.Socket。换句话说,我想向在localhost:5432上运行的postgresql服务器发出命令,并通过套接字获得响应 我的程序成功地建立了与postgresql server的连接,并成功地将数据刷新到内核,但我从未得到响
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)命令行工具,它接受在一行或几行上输入的命令,并对其进行解析,然后将其发送到数据库
PostgreSQL在端口5432的套接字上使用的是不同的基于文本的协议。您可以在他们的网站上阅读更多关于PostgreSQL协议的信息
使用模块连接到带有节点的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模块,但我对网络编程还不熟悉,我觉得最好先看看在幕后是如何工作的。谢谢你,波拉夫!
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
});