【问题标题】:Dynamic queries with knex-postgis使用 knex-postgis 进行动态查询
【发布时间】:2017-12-04 23:54:02
【问题描述】:

我正在构建一个简单的 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)"
}

但得到一个错误“未处理的拒绝错误:解析错误 - 无效几何” 硬编码的对象看起来一样并且工作正常。

我感觉我使用 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))

有什么建议吗?

【问题讨论】:

    标签: node.js knex.js


    【解决方案1】:

    您从邮递员传递坐标作为 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;
    },
    

    【讨论】:

    • 感谢您澄清这一点,真的帮助了我!显然还有很多东西要学
    猜你喜欢
    • 2018-01-27
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2014-06-28
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多