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

如何像使用终端一样使用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的连接,并成功地将数据刷新到内核,但我从未得到响

在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不向我发送任何数据,即使这些数据只是一个错误

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