通过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])