node-postgres $ 1 IS NULL错误

时间:2016-06-15 20:58:47

标签: javascript node.js postgresql

我使用node-postgres编写Web应用程序后端,我遇到了这个错误:

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)

我的查询的目标是接受从node express应用程序传入的查询参数,但如果api调用中不存在该参数,则不过滤数据库查询。例如,如果我的参数被称为variableType并且它被设置为tmax(例如,variableType=tmax),则数据库仅响应变量类型为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 个答案:

答案 0 :(得分:1)

问题出在$1 IS NULL,其中$1被视为动态列名,由于对数据库服务器实施的SQL注入的保护,因此在预准备语句中不允许这样做。

<强>更新

如果您想自由地格式化查询,同时也没有SQL注入的风险,请查看pg-promise。要正确设置架构,表格或列的名称格式,请参阅SQL Names