2016-06-15 6 views
2
私は、Webアプリケーションのバックエンドを書くために、ノードのpostgresを使用しています

されており、私はこのエラーに実行しています:

error: could not determine data type of parameter $1 
    at Connection.parseE (/home/***/niche-api/node/node_modules/pg/lib/connection.js:539:11) 
    at Connection.parseMessage (/home/***/niche-api/node/node_modules/pg/lib/connection.js:366:17) 
    at Socket.<anonymous> (/home/***/niche-api/node/node_modules/pg/lib/connection.js:105:22) 
    at emitOne (events.js:96:13) 
    at Socket.emit (events.js:188:7) 
    at readableAddChunk (_stream_readable.js:172:18) 
    at Socket.Readable.push (_stream_readable.js:130:10) 
    at TCP.onread (net.js:542:20) 
私のクエリの目標は、渡されたクエリパラメータを受け入れることです

inノードエクスプレスアプリから、パラメータがAPIコールに存在しない場合は、データベースクエリをフィルタリングしないようにします。たとえば、私のパラメータがvariableTypeと呼ばれ、tmax(たとえば、variableType=tmax)に設定されている場合、データベースはvariableTypeがtmaxのレコードでのみ応答します。エンドポイントが照会パラメーターなしでヒットした場合、データベースはすべてのレコードを戻します。

私のクエリは次のとおりです。

SELECT * FROM variableTypes WHERE 1 = 1 AND ($1 IS NULL or $1 = variableTypeAbbreviation); 

そして、私はこのようにそれを呼び出しています:

app.get("/variables", function(req, res){ 
    //get a list of the variables in the database 
    var variableType = req.query.variableType 
    if (variableType == undefined){ 
    variableType = null; 
    } 
    var client = new pg.Client({ 
    user: keys.user, 
    password: keys.password, 
    database: keys.dbName, 
    hostname: keys.hostname 
    }) 
    client.connect(function(err){ 
    if (err){ 
     res.json(err); 
    } 

    var query = client.query({name: 'variableSelect', text: "SELECT * FROM variableTypes WHERE 1 = 1 AND ($1 IS NULL or $1 = variableTypeAbbreviation);", values:[variableType]}); 
    console.log(query) 
    query.on('row', function(row, result){ 
     console.log("Got row") 
     result.addRow(row) 
    }) 
    query.on('end', function(result){ 
     console.log("Done.") 
     res.json(result) 
     client.end() 
    }) 

私は、クエリ($1 IS NULL)のセクションに配置されている問題にそれを絞り込むました。私はここからどこに行くのか本当に知りません。私はPythonで(psycopg2を使用して)同様のクエリを書いています。これは動作します。これは、ノードパッケージとの関連性が高いと思います。

query = select variableTypeID, variableType, variableTypeAbbreviation 
    from variableTypes 
    WHERE 1 = 1 
    AND 
     (%(abbreviation)s is NULL or %(abbreviation)s LIKE lower(variableTypes.variableTypeAbbreviation)) 
     AND (%(fullName)s is NULL or %(fullName)s = variableTypes.variableType) 

cursor.execute(query, {'fullName': fullName, 'abbreviation' : abbreviation}) 

ご迷惑をおかけして申し訳ありません。

答えて

1

問題は、$1がデータベース・サーバーによってインプリメントされたSQLインジェクションに対する保護のために、準備済みステートメントでは許可されない動的列名として扱われる$1 IS NULLにあります。

UPDATE

あなたは自由にあなたのクエリをフォーマットしたい場合は、またしながら、SQLインジェクションのリスクなしに、pg-promiseをチェックしてください。また、スキーマ、表、または列の名前を正しくフォーマットするには、SQL Namesを参照してください。

+0

ありがとうございます!それも私の結論でした。この構文を使わないでsqlで同じ結果を達成する方法はありますか? –

+0

@SCOTTFARLEY、用意されたステートメントを使用せず、単純なクエリのパラメータ化を使用します。私は例で私の答えを編集しました。 –

+0

pg-promiseはこれに最適です。どうもありがとう。 –

関連する問題