为什么knex向查询绑定数据时会抛出无法确定参数数据类型的错误?
错误原因
你将参数占位符?写在了ST_GeomFromText的单引号包裹的WKT文本内部,PostgreSQL的参数绑定规则不会解析单引号内的占位符,knex传入的$1、$2参数会被直接识别为POINT字符串的一部分,数据库无法判定这两个参数的实际数据类型,因此触发报错。
修复方案
推荐直接用ST_MakePoint接收传入的经纬度参数,不需要拼接WKT文本,写法更安全简洁:
try { // 先把参数转成数值类型,避免字符串类型导致异常 const lat = Number(req.params.latitude) const lon = Number(req.params.longitude) const resultDistance = await db('store') .select( db.raw(`ST_Distance(ST_MakePoint(?, ?), ST_MakePoint(store.latitude, store.longitude)) as distance`, [ lon, lat ]), 'id', 'title', 'owner_name' ) .orderBy('distance') .first() return res.status(200).send({ store: resultDistance }) } catch (error) { return res.status(400).send(error) }
注意:PostGIS的ST_MakePoint参数顺序为*(经度, 纬度)**,如果你的坐标存储顺序相反,记得调整参数传入顺序避免距离计算错误。*
如果你一定要使用ST_GeomFromText的写法,需要把占位符移到单引号外,用字符串拼接符拼接:
db.raw(`ST_Distance(ST_GeomFromText('POINT(' || ? || ' ' || ? || ')'), ST_MakePoint(store.latitude, store.longitude)) as distance`, [ req.params.latitude, req.params.longitude ])
内容的提问来源于stack exchange,提问作者wabud
相关产品推荐
相关产品推荐

