The*_*reg 5 database sockets postgresql node.js
在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);
})
Run Code Online (Sandbox Code Playgroud)
psql 是一种 (REPL) 命令行工具,它接受在一行或多行中输入的命令,对其进行解析,然后将其发送到数据库。
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');
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |