我使用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})
非常感谢任何建议!
答案 0 :(得分:1)
问题出在$1 IS NULL
,其中$1
被视为动态列名,由于对数据库服务器实施的SQL注入的保护,因此在预准备语句中不允许这样做。
<强>更新强>
如果您想自由地格式化查询,同时也没有SQL注入的风险,请查看pg-promise。要正确设置架构,表格或列的名称格式,请参阅SQL Names。