gpt4 book ai didi

javascript - node-postgres $1 IS NULL 错误

转载 作者:行者123 更新时间:2023-11-29 12:18:51 26 4
gpt4 key购买 nike

我正在使用 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),它有效,这让我认为它与 Node 包更相关。

  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 IS NULL 中,其中 $1 被视为动态列名,由于针对 SQL 注入(inject)的保护,这在准备好的语句中是不允许的由数据库服务器实现。

更新

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

关于javascript - node-postgres $1 IS NULL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37845663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com