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

标签 node.js database postgresql sockets

在 postgresql 终端中,我可以键入命令并获得响应。例如:

#创建数据库新数据库;

创建数据库

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

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

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

我还快速浏览了 wireshark 上发生的情况。看起来套接字已设置。我看到我的数据以明文形式发送。然后 postgresql 服务器发送一个 ACK​​ FIN ACK。我 ACK FIN ACK 然后 postgresql 服务器最后一次 ACK。所以我知道 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) 命令行工具,它接受在一行或多行中输入的命令,解析它,并将它发送到数据库。

PostgreSQL 并没有通过端口 5432 上的套接字使用相同的基于文本的协议(protocol)。您可以在他们的 documentation 中阅读有关 PostgreSQL 协议(protocol)的更多信息。 .

使用 pg使用 Node 连接到 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');
  });
}    

关于node.js - 如何使用 Node.js net.Socket 像使用终端一样与 Postgresql 数据库通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35626684/

相关文章:

node.js - 发送到客户端后无法设置 header - 发送 SES 电子邮件

mysql - MySql INFORMATION_SCHEMA.COLUMNS 中的 DATA_TYPE 和 COLUMN_TYPE 有什么区别

sql - 在 PostgreSQL 中返回两个没有重复属性的随机行

sql - PostgreSQL:如何合并多行?

java - 如何将 scala play 应用程序连接到 postgres 数据库

node.js - 如何创建异步 Gulp 插件?

javascript - 如何获取 fs.rename 的结果

javascript - 如何使用 mongoDB 和 Node.js 从集合中获取所有文档

Python/Django 建模问题

php - MySQL GROUP BY 花费大量时间来获取记录