使用 knex-postgis 进行动态查询

Dynamic queries with knex-postgis

我正在构建一个简单的 API,它也处理几何(存储到 postGIS 中)。 我正在使用 knex-postgis 通过 knex 访问 postGIS 中的 ST_ 空间函数。

我用这个例子插入了一个点,它在硬编码时有效。 但是我缺乏经验让我悬而未决,我怎样才能使查询动态化?我想创建一个带有 x 和 y 值输入的表单,并将其发送到 ST_geomFromText 函数以将其保存到数据库中的 geom 类型。 这是您使用参数的时候吗?有人能给我指出正确的方向吗?

// insert a point
const sql1 = db.insert({
  id: 1,
  geom: st.geomFromText('Point(0 0)', 4326)
}).into('points').toString();
console.log(sql1);
// insert into "points" ("geom", "id") values 
(ST_geomFromText('Point(0 0)'), '1')

到目前为止我已经试过了

router.post('/', (req, res, next) => {
  queries.create(req.body).then(poi => {
    res.json(poi[0]);
  });
});

插入查询

  create(poi) {
    const sql = db.insert(poi).returning('*').into('poi');
    return sql;
  },

在 Postman 中,我将其发送到正文中

{
    "place": "test",
    "comments": "new",
    "numbers": 6,
    "geom": "st.geomFromText('Point(-71.064544 44.28787)', 4326)"
}

但是报错"Unhandled rejection error: parse error - invalid geometry" 硬编码对象看起来一样并且工作正常。

我感觉我使用的 st.geomFromText 有误,但我不确定?

如果我 console.log 返回查询

,这就是我得到的结果
insert into "poi" ("comments", "geom", "numbers", "place") values ('new', 'st.geomFromText(''Point(-71.064544 44.28787)'', 4326)', 6, 'test')

(看怎么没把st.geom..改成st_geom..?还有ST函数和Point对象两边的引号不对)

当我在 pgAdmin运行 中

时,这个字符串有效
insert into "poi" ("comments", "geom", "numbers", "place") values ('new', st_GeomFromText('Point(-71.064544 44.28787)', 4326), 6, 'test')

编辑: 我也 console.log 硬编码版本。它似乎没有在几何值

上添加额外的 ''
insert into "poi" ("geom") values (ST_geomFromText('Point(-71.064544 44.28787)', 4326))

有什么建议吗?

您将来自邮递员的坐标 作为字符串值传递给 JSON 对象

"geom": "st.geomFromText('Point(-71.064544 44.28787)', 4326)"

并期望您的代码将其转换为 函数调用

st.geomFromText('Point(-71.064544 44.28787)', 4326)

knex 在这种情况下的作用。它需要你的 string 并将其转换为 string 字段(这里你得到一个单引号 ' 替换为双 '' 对于 Postgres 为 escape it).

你能做什么。像这样

将你的几何图形传递给你的 API
"geom": "Point(-71.064544 44.28787)"

并在您的路由处理程序中

create(poi) {
  const sql = db.insert({
    place: poi.place,
    comments: poi.comments,
    numbers: poi.numbers,
    geom: st.geomFromText(poi.geom, 4326)
  }).returning('*').into('poi');
  return sql;
},