使用node.js postgresql模块的正确方法是什么?

菲利普:

我正在Heroku上编写一个node.js应用程序,并使用pg模块我无法弄清楚为查询数据库所需的每个请求获取客户端对象的“正确”方法。

该文档使用如下代码:

pg.connect(conString, function(err, client) {
  // Use the client to do things here
});

但是,您肯定不需要pg.connect在使用数据库的每个函数中调用对吗?我看过其他执行此操作的代码

var conString = process.env.DATABASE_URL || "tcp://postgres:1234@localhost/postgres";
var client = new pg.Client(conString);
client.connect();
// client is a global so you can use it anywhere now

我倾向于第二种选择,因为我相信Heroku的免费数据库实例无论如何都仅限于一个连接,但是以这种方式进行操作是否有任何弊端?每次使用之前,是否需要检查我的客户端对象是否仍处于连接状态?

brianc:

我是node-postgres的作者首先,我很抱歉文档未能阐明正确的选项:这是我的错。我会尝试改善它。我刚才写了一份Gist来解释这一点,因为对话对于Twitter来说时间太长了。

使用pg.connect在Web环境中使用的方式

PostgreSQL服务器每次连接一次只能处理1个查询。这意味着如果您有1个全局new pg.Client()连接到后端,则基于postgres响应查询的速度,整个应用程序将成为瓶颈。它实际上将所有内容排列在一起,对每个查询进行排队。是的,它是异步的,所以没关系...但是您不是将吞吐量乘以10倍吗?使用pg.connect将设置pg.defaults.poolSize为合理(我们进行25-100次,尚不确定正确的数字)。

new pg.Client当您知道自己在做什么时。当出于某种原因需要单个长期存在的客户端,或者需要非常仔细地控制生命周期时。一个很好的例子是使用LISTEN/NOTIFY侦听客户端需要在周围并且连接并且不共享,以便它可以正确处理NOTIFY消息。另一个示例是在打开1-off客户端以杀死某些挂起的东西或在命令行脚本中时。

一件事很有帮助,就是将对应用程序中数据库的所有访问集中到一个文件中。pg.connect在整个过程中,请勿乱扔电话或新客户。有一个像db.js这样的文件

module.exports = {
   query: function(text, values, cb) {
      pg.connect(function(err, client, done) {
        client.query(text, values, function(err, result) {
          done();
          cb(err, result);
        })
      });
   }
}

这样,您可以将实现从pg.connect更改为自定义客户端池或任何其他内容,而只需要在一处更改。

看一下执行此操作的node-pg-query模块

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在node.js中计算Content-length标头的正确方法是什么

Node.js-require()d模块的范围是什么?

在Node.js中使用Akka的最佳方法是什么

Node.js域模块的替代方案是什么?

Node.js中要求的正确方法是什么?

使用ClientDependency Framework动态添加CSS或JS的正确方法是什么?

在Node.js 7中,抑制UnhandledPromiseRejectionWarning的正确方法是什么?

从Node.js中的模块导出函数的语法是什么?

使用Node.js MySQL库的正确方法是什么?

在node.js中使用async / await处理承诺拒绝的正确方法是什么?

Node.js:拆分代码的正确方法是什么?

模块化JS:Onclick复选框=>启用单选按钮以获取更多选项-使用模块化JS的正确方法是什么?

从Node.js中的AWS Lambda函数返回的正确方法是什么?

使用Neon vs Wasm编写Node.js模块之间的技术区别是什么?

在node.js v11.0.0中进行更改后,使用array.sort(a,b)的正确方法是什么?

使用Nuxt.js时,动态Vuex模块初始化的最佳方法是什么?

仅使用Node JS中包含数据的变量的正确方法是什么?

从Angular向Node js API发出HTTP请求的正确方法是什么?

(MERN)使用Express.js服务React应用的正确方法是什么?

同时使用Node.js中的许多MySQL服务器的正确方法是什么?

从Node使用Jasmine的正确方法是什么?

使用Node.js的Winston模块正确记录到文件

在Webpack中使用Three.js以便我可以使用OrbitControls的正确方法是什么?

在 node.js 中 fork 循环的正确方法是什么

在 Node.js 中,使用 async / await 处理错误的正确方法是什么?

使用 node.js 通过条件向多个主题发送 FCM 通知的正确语法是什么?

使用 Instafeed.js 显示非方形 Instagram 图像的正确方法是什么?

设置 Node.js 和 MySQL 的正确方法是什么?

在 Javascript(以及 Node.js)中使用 async/await 和 Promises 的正确方法是什么?