query.on不是一个函数。

16

我正在尝试学习如何使用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 对象时出现了错误? - jdmdevdotnet
query.on已从node-pg 7中删除。请参见https://node-postgres.com/guides/upgrading以了解如何正确处理行。 - Denys Séguret
1
从快速浏览文档来看,我从未使用过那个库,但是我没有看到关于.on的任何内容。他们使用回调、Promises或await/async而不是事件。 - baao
哦,这解释了很多问题。感谢您的澄清和链接!@DenysSéguret - tvonk13
3个回答

21

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

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

通常的做法是使用 promises 或 async/await(以更清晰的方式使用 promises):

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

7
注意,你不能在异步函数之外使用关键字await。将你的代码放入一个函数中,并在函数前加上async前缀。 - Fabien Haddadi
var res = await client.query("SELECT * FROM json_test"); 这一行代码会引发一个阻塞异常:UnhandledPromiseRejectionWarning,因为你不能避免处理 Promise 的拒绝。 - Peter
@Peter 把这段代码放到 try/catch 块中。我认为这个 QA 并不是关于如何处理 promises 和 async/await 的,所以它超出了范围。 - Denys Séguret

6

这是我的工作原理:

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

Node.js提供了许多库和驱动程序来连接数据库。Node-postgres是一个为PostgreSQL数据库提供的库之一。

以下是使用Node-postgres与PostgreSQL数据库建立连接的示例代码:

```javascript const { Client } = require('pg');
const client = new Client({ user: 'username', host: 'localhost', database: 'database_name', password: 'password', port: 5432, });
client.connect((err) => { if (err) { console.error('连接失败', err.stack); } else { console.log('已连接'); } }); ```

以上代码中,我们通过指定所需的连接信息创建了一个Client实例,并使用connect()方法来连接到数据库。如果连接成功,将会输出“已连接”;如果连接失败,将会输出错误信息。


这不回答原帖提出的问题。 - Peter Abolins
我也遇到了同样的问题,不过无论如何。 - Houda M

4

正如Denys Séguret在答案中提到的那样,函数query.on已被弃用。如果你是初学者,并且想要快速连接以尝试查询而不受async/await功能的干扰,可以尝试以下代码:

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()
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接