query.on 不是函数

Posted

技术标签:

【中文标题】query.on 不是函数【英文标题】:query.on is not a function 【发布时间】:2018-01-01 22:10:59 【问题描述】:

我正在尝试学习如何使用 javascript 连接到 postgresql 数据库,但是当我尝试使用 query.on(...) 将查询记录到控制台时,我收到一个类型错误,显示“query.on不是函数”。我已经广泛搜索了如何解决这个问题,但似乎找不到关于 .on 函数的任何文档。我知道连接是成功的,因为当我从终端查询数据库时,已经添加了两个新行。

jsontest.js

var pg = require('pg');
var conString = "postgres://[username]:[password]@localhost:5432/VONKTA1";
//username and password masked

var client = new pg.Client(conString);

client.connect();

client.query("INSERT INTO json_test (name, attributes) VALUES ('Ted', $1)", ["age": 2, "gender": "M"]);
client.query("INSERT INTO json_test (name, attributes) VALUES ('Sarah', $1)", ["age": 8, "gender": "F"]);

console.log("about to query");

var query = client.query("SELECT * FROM json_test");

query.on('row', function(row) 
    console.log(row);
);

query.on('end', function() 
    client.end();
);

package.json


  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "test.js",
  "scripts": 
    "test": "echo \"Error: no test specified\" && exit 1"
  ,
  "author": "",
  "license": "ISC",
  "dependencies": 
    "pg": "^7.0.2",
  

【问题讨论】:

在不知道pg.Client 是什么的情况下,您可以简单地控制台日志query 吗?可以看看有哪些方法可用,可能是在新建pg.Client对象的时候出错了? query.on 已从 node-pg 7 中删除。请参阅 node-postgres.com/guides/upgrading 了解如何正确处理行。 从未使用过该库,但快速浏览一下,我在文档中看不到任何关于 .on 的信息。他们使用回调、承诺或await/async 而不是事件 哦,这解释了这么多。感谢您的澄清和链接! @DenysSéguret 【参考方案1】:

query.on 已从 node-pg 7 中删除。

请参阅https://node-postgres.com/guides/upgrading 了解如何正确处理行。

通常的方式是使用promises或者async/await(使用promise的方式更清晰):

await client.connect();
var res = await client.query("SELECT * FROM json_test");
res.rows.forEach(row=>
    console.log(row);
);
await client.end();

【讨论】:

注意,您不能在async 函数之外使用关键字await。将您的代码放在函数中,并在“函数”前面加上 async var res = await client.query("SELECT * FROM json_test");此行引发了一个阻塞异常:UnhandledPromiseRejectionWarning,因为您无法避免处理承诺拒绝。 @Peter 将此代码放入 try/catch 块中。这个 QA 并不是关于如何处理 Promise 和 async/await,所以我认为这超出了范围【参考方案2】:

这对我来说是这样的:

var pg = require("pg");

var connectionString = 
  user: 'user',
  host: 'host',
  database: 'db',
  password: 'pass',
  port: 5432,
;

var pool = new pg.Pool(connectionString);

pool.connect(function(err, client, done) 

    const query = client.query(new pg.Query("SELECT * from products"))
    query.on('row', (row) => 
        console.log(row);
    )
    query.on('end', (res) => 
        // pool shutdown
        console.log("ending");
        pool.end()
    )
    query.on('error', (res) => 
        console.log(res);
    )

    done()
)

来源:https://node-postgres.com/features/connecting

【讨论】:

这不能回答 OP 的问题。 我也遇到了同样的问题【参考方案3】:

正如 Denys Séguret 在回答中提到的,函数 query.on 已被弃用。如果您是初学者并且想要快速连接来尝试您的查询,而不会被异步/等待功能所困扰。你可以试试下面的代码:-

const  Pool, Client  = require('pg')
const connectionString = 'postgresql://dbuser:dbpassword@database.server.com:5432/mydb'

const pool = new Pool(
  connectionString: connectionString,
)

pool.query('SELECT NOW()', (err, res) => 
  console.log(err, res)
  pool.end()
)

【讨论】:

以上是关于query.on 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

题解 SP375 QTREE - Query on a tree

HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树

HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树

HDU 6191Query on A Tree 可持久化字典树

SPOJ QTREE - Query on a tree

bzoj3639: Query on a tree VII