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)
へ
の名前であると考えて実際にエラーは2番目の機能にあります。それは 'RETURNS SETOF device_token' –
hm - ' ERROR:type "テーブル(eidテキスト、プラットフォームテキスト、device_typeテキスト)が"存在しません " 'それをコンパイルしようとしています。奇妙な名前? –