node-postgres不显示存储过程的结果集

时间:2017-05-03 22:11:30

标签: postgresql express stored-procedures promise node-postgres

我正在尝试使用存储过程来创建角色。该过程进行了一些验证,以确保params在插入数据库之前是有效的(让我们在数据库上保持此验证)。但是,当我尝试在我的Web界面中使用无效数据的过程时,没有结果集,并且不会发生错误承诺。如何使此过程在节点端导致错误,我该怎么做?

-- add a character with the universe performing the universe name lookup
CREATE OR REPLACE FUNCTION add_character(
  IN p_chr_name VARCHAR(255),
  IN p_unv_name VARCHAR(255),
  IN p_chr_bio  TEXT
)
  RETURNS INT AS $$
DECLARE
  unv_id  INTEGER := (SELECT unv_id
                      FROM universes
                        WHERE LOWER(unv_name) = LOWER(p_unv_name));
  new_id  INTEGER := NULL;
BEGIN
  IF unv_id IS NULL THEN
    RAISE EXCEPTION 'unv_id is null for %', p_unv_name;
  END IF;
  INSERT INTO characters(chr_name, chr_unv_id, chr_bio) VALUES
    (p_chr_name, unv_id, p_chr_bio)
  RETURNING chr_id INTO new_id;
  RETURN new_id;
END $$
LANGUAGE PLPGSQL;

javascript

app.post('/contrib/chr', (req, res) => {
    console.log(req.body);
    pool.query('SELECT add_character($1, $2, $3)'
        [req.body.chr_name, req.body.unv_name, req.body.chr_bio])
        .then((rows) => {
            console.log(rows);
            res.render('contrib');
        }).catch((err) => {
            console.error('contrib-chr-err', err);
            res.render('contrib');
        });
})

返回了行对象。

{ command: '', rowCount: NaN, rows: [], fields: null }

1 个答案:

答案 0 :(得分:0)

工作样本:

<强> SQL:

t=# create or replace function s110(_b boolean) returns int as
$$
begin
  if not _b then
   raise info '%','here is notice';
   raise warning '%','warning it is';
  end if;
  if _b then
   raise exception '%','final exception it is';
  end if;
 return 9;
end;
$$ language plpgsql;
CREATE FUNCTION

<强> JS

var pg = require('pg');
var client = new pg.Client({"database": "t"});
client.connect(function (err) {
  if (err) throw err;
  client.query('SELECT * from s110(true)', [], function (err, result) {
    if (err) throw err;
    console.log(result);
    client.end(function (err) {
      if (err) throw err;
    });
  });
});

生成

MacBook-Air:n vao$ vi q1.js && node q1.js
/Users/vao/n/q1.js:6
    if (err) throw err;
             ^

error: final exception it is
    at Connection.parseE (/Users/vao/node_modules/pg/lib/connection.js:569:11)
    at Connection.parseMessage (/Users/vao/node_modules/pg/lib/connection.js:396:17)
    at Socket.<anonymous> (/Users/vao/node_modules/pg/lib/connection.js:132:22)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
    at TCP.onread (net.js:531:20)

如果我将 SELECT * from s110(true)更改为SELECT * from s110(false)

MacBook-Air:n vao$ vi q1.js && node q1.js
{ command: 'SELECT',
  rowCount: 1,
  oid: NaN,
  rows: [ { s110: 9 } ],
  fields:
   [ { name: 's110',
       tableID: 0,
       columnID: 0,
       dataTypeID: 23,
       dataTypeSize: 4,
       dataTypeModifier: -1,
       format: 'text' } ],
  _parsers: [ [Function] ],
  RowCtor: [Function],
  rowAsArray: false,
  _getTypeParser: [Function: bound ] }

<强>更新 此外,您可以获得STDOUT消息,几乎没有变化。我不擅长使用javascript,希望我不会在这里提出非常愚蠢的建议。如果您在.query上方添加此行:

client.connection.on('message', function(a) {console.log(a);});
client.query('SELECT s110(false)', [], function (err, result) {...

您将获得RAISE的所有console.log输出:

{ [notice: here is notice]
  name: 'notice',
  length: 123,
  severity: 'INFO',
  code: '00000',
  detail: undefined,
  hint: undefined,
  position: undefined,
  internalPosition: undefined,
  internalQuery: undefined,
  where: 'PL/pgSQL function s110(boolean) line 4 at RAISE',
  schema: undefined,
  table: undefined,
  column: undefined,
  dataType: undefined,
  constraint: undefined,
  file: 'pl_exec.c',
  line: '3165',
  routine: 'exec_stmt_raise' }
{ [notice: warning it is]
  name: 'notice',
  length: 128,
  severity: 'WARNING',
  code: '01000',
  detail: undefined,
  hint: undefined,
  position: undefined,
  internalPosition: undefined,
  internalQuery: undefined,
  where: 'PL/pgSQL function s110(boolean) line 5 at RAISE',
  schema: undefined,
  table: undefined,
  column: undefined,
  dataType: undefined,
  constraint: undefined,
  file: 'pl_exec.c',
  line: '3165',
  routine: 'exec_stmt_raise' }
{ name: 'dataRow', length: 11, fieldCount: 1, fields: [ '9' ] }
{ name: 'commandComplete', length: 13, text: 'SELECT 1' }
{ name: 'readyForQuery', length: 5, status: 'I' }