2017-02-07 4 views
1

私はノードを使い慣れており、その後pg-promiseです。私のノードエクスプレスアプリケーションで達成しようとしているのは、DB内のテーブル内で単一のフィールド更新を行うapiとして機能するルートです。これは、表で更新する行を識別するために、表名、列名、列値および列ID値とともに呼び出される単なるルートでなければなりません。pg-promiseでテーブル名とパラメータを渡す方法

これは私がこれまで試してみましたコードですが、私はそれが正しいように見えることはできません。

router.post('/update_db_field', function (req, res, next) { 
    db.one('update $table~ set $dbcol~=$dbcolval~ where $dbcolid~=$dbcolidval~ returning $colid~', [ 
     req.body.table, 
     req.body.dbcol, 
     req.body.dbcolid, 
     req.body.dbcolval, 
     req.body.dbcolidval 
    ]).then(function (data) { 
     console.log(data) 
     res.send(data) 
    }).catch(function (error) { 
     console.log("ERROR:", error.message || error); // print error; 
    }); 
}) 

は、残念ながら、それは次のようなエラーがスローされます。

ERROR: syntax error at or near "$"

もあります方法は、catch()関数からクエリ文字列を印刷するので、デバッグは少し簡単にすることができますか?

+0

あなたのクエリが無効であるように見える$記号は、$ 1 $ 2から始まるパラメータを参照するので、配列のパラメータにマップされます –

+0

ありがとうございました。コンソール上に表示されたクエリテキストを確認するにはどうすればよいですか? –

+0

@FabrizioMazzoniは私の答えが十分ではなかったのですか? ;) –

答えて

1

名前付きパラメータと変数の書式を混同し、クエリは次のようになります。

router.post('/update_db_field', function (req, res, next) { 
    db.one('UPDATE ${table~} SET ${dbcol~} = ${dbcolval} WHERE ${dbcolid~} = {dbcolidval} RETURNING ${colid~}', req.body, a => a[req.body.dbcolid]) 
    .then(function (dbcolid) { 
     console.log(dbcold) 
     res.send(dbcolid) 
    }) 
    .catch(function (error) { 
     console.log("ERROR:", error.message || error); // print error; 
    }); 
}) 

動的テーブル+列に渡すと、あなたがそれらをキャストする方法がわからないことを意味しますので、あなたがまだ可能性が、問題がありますけれどもその正しい型です。たとえば、dbcolvalが文字列として渡され、整数である必要があります。そのためにクエリが拒否されます。

オプションのa => a[req.body.dbcolid]を追加したので、1つのプロパティを持つオブジェクトで解決するのではなく、プロパティ値で直接解決します。

How can I see the query text printed in console?

var query = pgp.as.format(query, values); 
console.log(query); 

API:as.format

関連する問題