You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:15:00