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 || 欧拉序列 || 动态树