2017-10-18 11 views
1

すべてのbodyパラメータがオプションであるREST APIにパッチエンドポイントがあります。手動で各パラメータをチェックせずに実装する最良の方法は何ですか? helpers名前空間のpg-promiseの動的名前付きパラメータ

db.none("update tasks set title=$1, description=$2, value=$3 where id=$4", 
    [req.body.title, req.body.description, parseInt(req.body.value), req.params.id]) 
    .then(function() { 
     res.status(200) 
      .json({ 
       status: "success", 
       message: "Updated task" 
      }); 
    }) 
    .catch(function (err) { 
     return next(err); 
    }); 
+1

クエリには4つのパラメータが含まれ、3つの値しか渡されません。これは正しく見えません。最初にあなたの例を修正する必要があります。 –

答えて

1

使用方法:

静的宣言

const optional = name => ({name, skip: col => !col.exists}); 

const cs = new pgp.helpers.ColumnSet([ 
    optional('title'), 
    optional('description'), 
    optional('value') 
], {table: 'tasks'}); 

クエリを生成し、それを実行する:

const update = pgp.helpers.update(req.body, cs) + ' WHERE id = ' + req.params.id; 

db.none(update) 
    .then(function() { 
     res.status(200) 
      .json({ 
       status: "success", 
       message: "Updated task" 
      }); 
    }) 
    .catch(function (err) { 
     return next(err); 
    }); 

さらに、メソッドhelpers.updateのオプションemptyUpdateを使用して、少なくとも1つの列が設定されていることを確認して、無効なクエリ生成要求と投げられたエラーを回避することができます。

+0

私は静的宣言部を理解するために、簡単に説明したり正しい方向に向けることができますか? – Shakur

+0

@Shakur Static - これは一度だけ宣言することを意味します。 APIとドキュメントを持つすべてのタイプへのリンク - 私はあなたを最初から教えてくれました。もっとたくさんの例が必要な場合は、 'pg-promise ColumnSet'を検索するとStackOverflowにたくさんあります:https://stackoverflow.com/search?tab=votes&q=pg-promise%20ColumnSet –

関連する問題