代码之家  ›  专栏  ›  技术社区  ›  villasv

记录Sequelize的postgres输出消息

  •  1
  • villasv  · 技术社区  · 6 年前

    在我的Postgres9.6rds实例中,我有一个触发器,通常用于记录传入的可疑数据:

    create or replace function check_stuff()
    returns trigger as
    $$
    declare passed boolean;
    begin
        raise warning 'something weird happened';
        return new;
    end;
    $$
    language plpgsql
    
    CREATE TRIGGER check_stuff_trigger
       BEFORE UPDATE ON important_table
       FOR EACH ROW
       EXECUTE PROCEDURE check_stuff();
    

    如何配置sequenceize以便接收和记录这些消息?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Timshel    6 年前

    我不相信 sequelize.js 具有读取数据库消息(如您正在引发的警告消息)的任何功能。

    不过,我看了一下 node-postgres (其中 sequelize 作为PostgreSQL的后端),它似乎有 .on('notice',...) 上的事件 Client 对象(Sequelize用于postgres连接)。我想当 RAISE WARNING 在连接上执行。

    添加 .on('notice', ...) 中的处理程序 afterConnect Sequelize hook将实现您能够记录 提出警告 消息;我已经对下面的代码片段执行了测试,它可以工作:

    sequelize.addHook('afterConnect', (client) => {
      // "client" is a node-postgres Client instance when using the postgres dialect
      client.on('notice', (notice) => {
        // Filter to (for example) only log "RAISE WARNING" level messages
        if (notice.severity === 'WARNING') {
          console.log(`Received notice with severity ${notice.severity}: ${notice.message}`);
        }
      });
    });
    

    这个 client 论证 后连接 是一个 节点后缀 顾客 PostgreSQL方言中的实例;请参阅 https://node-postgres.com/api/client#client-on-39-notice-39-notice-string-gt-void-gt-void 用于文档。但是,看起来doco是错误的,因为我的测试显示 .on('notice', (arg) => {...}) , arg 作为对象传递,其中文档建议 string .