【问题标题】:Nodejs - Postgres - Notify - Error bind messageNodejs - Postgres - 通知 - 错误绑定消息
【发布时间】:2018-04-05 18:12:20
【问题描述】:

我正在使用node-postgres (v-6.1.2)

这是我正在重构的代码,因为查询中的参数未参数化。这是我没有写的代码!

我有以下函数publish,其中pubClient

new pg.Client(pubsubUri).connect((err, client) => {
    if(err) return logger.error('database-connect', err.message)

    pubClient = client
})

当我运行publish 时出现以下错误:

error: bind message supplies 2 parameters, but prepared statement "" requires 0

这是我的发布方法:(类型和消息都是字符串类型)

let publish = ( type, message) => {
    if (pubClient) {
        pubClient.query('NOTIFY "$1", \'$2\'', [type, message], (err, res) => {
            if (err) {
                console.log(err)
              return
            }
          return true
        })

    }

    return false
}

我不知道查询的正确语法是什么,也不知道为什么会出现此错误。

任何帮助将不胜感激!

【问题讨论】:

  • 你怎么打电话给publish
  • 另外,您还错误地返回了 truefalse。这是异步编程,需要用truefalse回调
  • 我知道。这是我正在重构的代码(我没有写)。它实际上是同步运行的。我只是添加了回调来查看错误是什么
  • 原样 publish 被称为 publish('HELLO', {"payload": {....}})
  • 一定是查询字符串搞砸了。它看起来也很奇怪。

标签: node.js postgresql notify node-postgres


【解决方案1】:
NOTIFY channel [ , payload ]

通道无法参数化。尝试使用 pg_notify:

let publish = (type, message) => {
    if (pubClient) {
        pubClient.query('SELECT pg_notify($1, $2)', [type, message], (err, res) => {
            if (err) {
                console.log(err)
              return
            }
          return true
        })

    }

    return false
}

【讨论】:

  • 做到了!谢谢!文档中哪里说不能参数化通道?
  • 文档中没有说。但是从示例查询中可以看到NOTIFY test, 'test'; 第一个参数不是字符串,而是标识符,因此无法绑定。表名也会发生同样的事情——你不能绑定它们。 pg_listen 应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多