通过nodejs和websockets保存从openlayers到postgis的function

我正在尝试通过websockets将创build在vector图层(openlayers)上的特性保存到postgreSQL 9.1 / postGIS 2.0中。 我正在使用websockets,因为我正在插入表单数据,以及几何。

我的服务器是NodeJS 0.10.12和pg模块。

我正在尝试将一个要素的几何体转换为一个string,将其从字母和括号中除去,并只将数字发送给服务器。 我在服务器端获得有关几何的语法错误。

尽pipe尝试了很多东西和不同的语法,我仍然无法解决这个问题。

客户端(片段)

//create websockets var so = new WebSocket("ws://localhost:8000"); //error report for websockets so.onerror=function (evt) {saveMSG.textContent = evt;} //open websockets so.onopen = function(){ //get geometry var jak=map.layers[2].features[0].geometry; //make it a string var as=new String(jak); //keep the numbers var hul=as.substring(11,as.length-1); //make it WKT var god=hul.toString(); //send it with stringify/websockets so.send(JSON.stringify({command: 'insertAll', geo: god, //send other things from the form.... 

和服务器端

 var packet = JSON.parse(msg.utf8Data); switch (packet['command']) {case 'insertAll':insertEm(packet['geo']) ;break; //other cases here...call function according to case... //so "insertAll" calls the following function insertEm(geo){ //get client data, put them in place and create a string var met="ST_GeomFromText('LINESTRING("+geo+")',900913)"; var pra=new String(met); //connect to db and execute prepared statement var conString = "pg://user:user@localhost:5432/myDB"; var client = new pg.Client(conString); client.connect(); var query = client.query({name:"inser", text:"INSERT INTO pins(p_geom) values($1)", values:[pra]}); 

我得到的错误: [error: parse error - invalid geometry] hint: '"ST"<-- parse error a position 2 within geometry']

所以我想也许它准备好的陈述错误?

我已经把它切换到一个简单的查询,如:

var query = client.query("INSERT INTO pins (p_geom) values('"+pra+"')")

我得到的错误

[error: syntax error at or near "LINESTRING"]

在查询结束时,我把query.on("end", function (result) {console.log(result);connection.send(pra); client.end();});

所以我可以看到客户端发送到服务器。 我明白了

ST_GeomFromText('LINESTRING(2335859.0225 4725430.1340625,2378933.155 4741356.7040625)',900913)

看起来不错

有什么build议么? 我真的不知道如何解决这个问题。

有了这个查询:

var query = client.query("INSERT INTO pins (p_geom) values('"+pra+"')")

你不应该引用pra 。 这将引用ST_GeomFromText函数调用,并且您提交的查询将如下所示:

var query = client.query("INSERT INTO pins (p_geom) values('ST_GeomFromText('LINESTRING(2335859.0225 4725430.1340625,2378933.155 4741356.7040625)',900913)')")

PostGIS认为你正在尝试提交格式不正确的string,并在其中间使用单引号。

切换您的查询string生成器来做到这一点应该工作:

var query = client.query("INSERT INTO pins (p_geom) values("+pra+")")

但不要这样做

你现在正在打开自己的SQL注入攻击,因为有人可能破解HTTP请求发送偷偷摸摸的东西,而不是几何WKT你期待。 不要使用string连接将来自Web浏览器的inputembedded到数据库查询中,因为它绕过了框架的某些安全function。

现在,回到第一次尝试使用参数化查询:

node.js库试图准备参数以便插入到数据库中,并将其视为一个string,用单引号括起来,并转义所有embedded的单引号。 这导致查询被发送到PostGIS:

INSERT INTO pins(p_geom) values('ST_GeomFromText(''LINESTRING(2335859.0225 4725430.1340625,2378933.155 4741356.7040625)'',900913)')

然后PostGIS帮助尝试通过parsingstring转换为几何,并抱怨有效的几何不会以“ST”开始

而不是传递ST_GeomFromText(...)作为一个string参数, 只是传递查询的部分是真正的string – WKT 。 像这样的东西:

var wkt = "LINESTRING("+geo+")";

var query = client.query('INSERT INTO pins(p_geom) values(ST_GeomFromText(?,900913))', [wkt])