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

     2023-03-08     205

关键词:

【中文标题】如何使用 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 模块与 browserify 一起使用?

】如何将Node.js中的net模块与browserify一起使用?【英文标题】:HowtousethenetmodulefromNode.jswithbrowserify?【发布时间】:2015-08-3003:02:27【问题描述】:我想在客户端(在浏览器中)使用来自Node.js的net模块:varnet=require(\'net\');所以我查... 查看详情

Node.js 与 CouchDB 和 Backbone.js 一起使用,如何提供 json?

】Node.js与CouchDB和Backbone.js一起使用,如何提供json?【英文标题】:Node.jsworkswithCouchDBandBackbone.js,Howjsonisbeingserved?【发布时间】:2012-05-3114:10:46【问题描述】:我正在尝试构建一个用于学习Node.js的测试应用程序。我来自wordpress背... 查看详情

如何将 jsonp 与 node.js express 一起使用

】如何将jsonp与node.jsexpress一起使用【英文标题】:Howtousejsonpwithnode.jsexpress【发布时间】:2013-08-1609:31:01【问题描述】:我正在尝试使用node.js制作三星智能电视应用程序。在我的项目中,我想让我的应用程序与服务器pc通信。根... 查看详情

node.js实现websocket客户端

笔者在工作中闹出了用nodejs的net.socket连接WebSocket服务器的笑话,故写文记录WebSocket的有关信息,并给出在nodejs实现WebSocket客户端的方法。WebSocket与socket的区别WebSocket是一种双向通信协议,客户端和服务器都可以发送和接收数据... 查看详情

javascript如何将mongodb与node.js一起使用(代码片段)

查看详情

如何使用 mongoose 将本地 mongodb 与 node.js 应用程序连接?

】如何使用mongoose将本地mongodb与node.js应用程序连接?【英文标题】:howtoconnectlocalmongodbwithanode.jsapplicationusingmongoose?【发布时间】:2020-11-2018:02:32【问题描述】:我第一次开发全栈应用程序。我在使用mongoose将本地MongoDB与node.js应... 查看详情

如何将 Mongoose/Mongodb 与 node.js- 护照身份验证一起使用

】如何将Mongoose/Mongodb与node.js-护照身份验证一起使用【英文标题】:HowtouseMongoose/Mongodbwithnode.js-passportauthentication【发布时间】:2022-01-0814:22:48【问题描述】:我正在构建我的第一个全栈node.js应用程序,我想使用护照进行身份验... 查看详情

如何将 Asterisk ARI 与 socket.io 和 Node.js 一起使用

】如何将AsteriskARI与socket.io和Node.js一起使用【英文标题】:HowtouseAsteriskARIwithsocket.io&Node.js【发布时间】:2016-01-0207:27:24【问题描述】:最近开始接触星号、Linux、node.js和最近的socket.io,以便我最终可以为星号制作实时Web应用... 查看详情

您将如何将 node.js 子进程与 discord.js 一起使用?

】您将如何将node.js子进程与discord.js一起使用?【英文标题】:Howwouldyouusenode.jschildprocesseswithdiscord.js?【发布时间】:2021-09-0118:25:58【问题描述】:所以我有一个用javascript编码的不和谐机器人,它在与数据库交互或进行图像处理... 查看详情

如何使用 Node.js 建立与 MongoDB 数据库的 SSH 隧道连接

】如何使用Node.js建立与MongoDB数据库的SSH隧道连接【英文标题】:HowtouseNode.jstomakeaSSHtunnelingconnectiontoaMongoDBdatabase【发布时间】:2016-11-2509:16:22【问题描述】:我的凭据与Robomongo完美配合,但我无法与node.js建立连接我尝试使用ssh2... 查看详情

如何将 REST 与 Node.js 和 AngularJS 一起使用在不同的端口上?

】如何将REST与Node.js和AngularJS一起使用在不同的端口上?【英文标题】:HowtouseRESTwithNode.jsandAngularJSbeingondifferentport?【发布时间】:2013-03-0907:00:55【问题描述】:我正在尝试了解Angular和Node.js在后端的合作。但是我不知道如何使用... 查看详情

请求新页面时如何将 AngularJS 路由与 Express (Node.js) 一起使用?

】请求新页面时如何将AngularJS路由与Express(Node.js)一起使用?【英文标题】:HowtouseAngularJSrouteswithExpress(Node.js)whenanewpageisrequested?【发布时间】:2012-10-2416:58:13【问题描述】:我正在使用Express,它从静态目录加载AngularJS。通常,我... 查看详情

如何在 node.js 中使用 sequelize-npm 实现与连接表的一对多关系

】如何在node.js中使用sequelize-npm实现与连接表的一对多关系【英文标题】:Howtoimplementone-to-manyrelationshipwithjointableusingsequelize-npminnode.js【发布时间】:2016-01-2809:59:59【问题描述】:我正在node.js中编写RESTAPI,并将其作为MySQLORM。我... 查看详情

Node.js 和 JQuery:“ReferenceError:$ 未定义”错误。如何在服务器上将 jquery 与节点一起使用?

】Node.js和JQuery:“ReferenceError:$未定义”错误。如何在服务器上将jquery与节点一起使用?【英文标题】:Node.js&JQuery:"ReferenceError:$isnotdefined"error.HowdoIusejquerywithnodeontheserver?【发布时间】:2016-07-3007:05:33【问题描述】:... 查看详情

如何将 Node.js Web 服务器与 Apache Cordova 应用程序一起使用

】如何将Node.jsWeb服务器与ApacheCordova应用程序一起使用【英文标题】:HowtouseaNode.jswebserverwithanApacheCordovaApplication【发布时间】:2015-09-1501:42:43【问题描述】:我设计了一个ApacheCordova应用程序,它使用Node.jsWeb服务器从WebAPI中提取... 查看详情

MySQL 与 Node.js

...所以我相当习惯于使用MySQL来满足我所有的数据库需求。如何在Node.js中使用MySQL?【问题讨论】:你最后做了什么?下面有一些很好的信息,我很想听听你的经历@Landon,实际上使用node-mysql有几个原因,主要是因为它处于相当活... 查看详情

GraphQL 如何在 node.js 中将服务器错误与客户端错误(最好使用 TryCatch 块)分开?

】GraphQL如何在node.js中将服务器错误与客户端错误(最好使用TryCatch块)分开?【英文标题】:GraphQLHowtoseperateServererrorsfromClienterrors(ideallyusingTryCatchblocks)innode.js?【发布时间】:2021-10-0409:21:48【问题描述】:tryconstres=awaitUserModel.fin... 查看详情

如何检测 HDMI 设备是不是与 Node JS 连接?

】如何检测HDMI设备是不是与NodeJS连接?【英文标题】:HowtodetectHDMIdeviceisconnectedwithNodeJS?如何检测HDMI设备是否与NodeJS连接?【发布时间】:2019-06-3009:45:46【问题描述】:我们需要Nodejs和Electron中的HDMI信息。如果任何HDMI与系统连... 查看详情