0

Ich versuche eine gespeicherte Prozedur zu verwenden, um ein Zeichen zu erstellen. Die Prozedur führt eine Überprüfung durch, um sicherzustellen, dass die Parameter gültig sind, bevor sie in die Datenbank eingefügt werden (lassen Sie uns diese Validierung in der Datenbank behalten). Wenn ich jedoch versuche, die Prozedur in meiner Webschnittstelle mit ungültigen Daten zu verwenden, gibt es kein Ergebnis, und die Fehlerversprechung tritt nicht auf. Was muss ich tun, damit diese Prozedur einen Fehler auf der Knotenseite verursacht?node-postgres zeigt keine Ergebnismenge für gespeicherte Prozedur an

-- 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; 

Die 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'); 
     }); 
}) 

Das Zeilenobjekt zurückgegeben.

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

und erhalten Sie .. err ist leer? dann Zeilen? .. –

+0

@VaoTsun Ich werde eine Kopie des Zeilenobjekts hinzufügen, das zurückgegeben wird. – HSchmale

+0

@HSchmale nicht 'SELECT func_name' verwenden,' SELECT * FROM func_name';) –

Antwort

0

Arbeitsprobe:

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

Lauf

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) 

wenn ich ändernSELECT * 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 ] } 

UPDATE Sie können auch STDOUT Nachrichten mit wenig Veränderung bekommen. Ich bin nicht gut in Javascript, hoffentlich rate ich hier nicht sehr dumme Sachen. Wenn Sie diese Zeile über .query hinzufügen:

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

Sie alle RAISE Ausgabe console.log erhalten:

{ [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' } 
Verwandte Themen