2017-05-16 9 views
0

私はこのマシンのキーボードに対して頭を叩きました。私はポストグルバックエンドを使用しています。ノードサーバーとpghelperが一番上にあります。私は完璧に機能する1つの関数を持っています。下記参照。ノードサーバでPostgresバックエンド機能が期待どおりの結果を返さない

サーバー側のコード

findAllRegisteredTokensByNotificationId: function(req,res, next){ 
    try{ 
     var route = '[GET] - /api/device-tokens/' + req.params.nid; 
     Auth.validateHeader(req.headers, route, res, function(){ 
      if(req && req.params && req.params.nid){ 
       pgHelper.connectDBAndFindResult('getAllTokensByNotificationId',[req.params.nid], res, function(result){ 
        if(result){ 
         return res.status(200).json({ data: result.rows, message: 'Retrieved ALL registered device tokens.'}); 
        } 
        else{ 
         return res.status(500).json({ message: 'Error finding registered device tokens.'}); 
        } 
       }); 
      } 
      else{ 
       logger.processError('Error retrieving registered device tokens: Not a valid Request.', res, 500); 
      } 
     }); 
    } 
    catch(err){ 
     logger.processError('Error finding Device Tokens:' + JSON.stringify(err.message), res,500); 
    } 
} 

DB側のコード

-- FUNCTION: stardb.getallregisteredtokensfornotification(integer) 

-- DROP FUNCTION stardb.getallregisteredtokensfornotification(integer); 

CREATE OR REPLACE FUNCTION stardb.getallregisteredtokensfornotification(
integer) 
RETURNS SETOF "TABLE(eid text, platform text, device_type text)" 
LANGUAGE 'plpgsql' 
COST 100.0 
VOLATILE 
ROWS 1000.0 
AS $function$ 

BEGIN 
FOR eid, platform, device_type IN 
SELECT DT.eid, DT.platform, DT.device_type 
    FROM notification_token NT JOIN device_token DT 
    ON NT.token_id = DT.token_id and NT.notification_id = ($1) 
LOOP 
RETURN NEXT; 
END LOOP; 
RETURN;  
END; 

$function$; 

ALTER FUNCTION stardb.getallregisteredtokensfornotification(integer) 
OWNER TO stardb; 

その後、私はあなたがDBにクエリを実行すると正常に動作し、ここで別の機能を持っていますが、ノードサーバそれを介して呼び出されたとき予期しない結果をもたらす。

サーバー側のコード

findAllRegisteredTokensByApplicationId: function(req,res, next){ 
    try{ 
     var route = '[GET] - /api/device-tokens/tokens/' + req.params.aid; 
     Auth.validateHeader(req.headers, route, res, function(){ 
      if(req && req.params && req.params.aid){ 
       pgHelper.connectDBAndFindResult('getallregisteredtokensbyappid',[req.params.aid], res, function(result){ 
        if(result){ 
         return res.status(200).json({ data: result, message: 'Retrieved ALL registered device tokens per App'}); 
        } 
        else{ 
         return res.status(500).json({ message: 'Error finding registered device tokens.'}); 
        } 
       }); 
      } 
      else{ 
       logger.processError('Error retrieving registered device tokens: Not a valid Request.', res, 500); 
      } 
     }); 
    } 
    catch(err){ 
     logger.processError('Error finding Device Tokens:' + JSON.stringify(err.message), res,500); 
    } 
}, 

DBサイドコード

-- FUNCTION: stardb.getallregisteredtokensbyappid(integer) 

-- DROP FUNCTION stardb.getallregisteredtokensbyappid(integer); 

CREATE OR REPLACE FUNCTION stardb.getallregisteredtokensbyappid(
integer) 
RETURNS SETOF device_token 
LANGUAGE 'plpgsql' 
COST 100.0 
VOLATILE 
ROWS 1000.0 
AS $function$ 

DECLARE 
r device_token%rowtype; 
BEGIN 
FOR r in SELECT token_id, token, eid, platform, device_type, app_id 
     FROM device_token where app_id = ($1) 
LOOP 
    RETURN next r; 
END LOOP; 
RETURN; 
END;  

$function$; 

ALTER FUNCTION stardb.getallregisteredtokensbyappid(integer) 
OWNER TO stardb; 

期待される結果

{ 
"data": [ 
{ 
    "token_id": 15, 
    "token": "zzzzzzzzzzzz", 
    "id": "dddddddd", 
    "platform": "iOS", 
    "device_type": "iPhone", 
    "app_id": 1 
}, 
{ 
    "token_id": 16, 
    "token": "1234", 
    "eid": "BAD-TO", 
    "platform": "iOS", 
    "device_type": "iPhone", 
    "app_id": 1 
} 
], "message": "Retrieved ALL registered device tokens." } 

実際の結果

{ 
"data": { 
"command": null, 
"rowCount": null, 
"oid": null, 
"rows": [], 
"fields": [], 
"_parsers": [], 
"RowCtor": null, 
"rowAsArray": false 
}, 
    "message": "Retrieved ALL registered device tokens."} 

必要な他のスニペットを提供できます。何か助けてくれてありがとう!あなたは二重引用符のpostgresのを使用するときは、setof sometypeまたはtable(list types)を返すのいずれか

RETURNS TABLE(eid text, platform text, device_type text) 

答えて

0
RETURNS SETOF "TABLE(eid text, platform text, device_type text)" 

変更が"TABLE(eid text, platform text, device_type text)"が期待通りに現在取り組んでいる機能であるタイプ

+0

の名前であると考えて実際にエラーは2番目の機能にあります。それは 'RETURNS SETOF device_token' –

+0

hm - ' ERROR:type "テーブル(eidテキスト、プラットフォームテキスト、device_typeテキスト)が"存在しません " 'それをコンパイルしようとしています。奇妙な名前? –

関連する問題