我的服务器是NodeJS 0.10.12和pg模块.
我正在尝试将要素的几何转换为字符串,将其从字母和括号中删除,并仅将数字发送到服务器.我在服务器端遇到有关几何的语法错误.
尽管尝试了很多东西和不同的语法,但我无法修复它.
客户端(代码段)
//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]});
我收到错误:
[错误:解析错误 – 无效几何]提示:’“ST”< - 解析几何'中位置2的错误 所以我想也许它准备好的陈述错了? 我已将其切换为简单查询,如: var query = client.query(“INSERT INTO pins(p_geom)values(‘”pra“’)”) 我得到了错误 [错误:“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)
看起来很好……
有什么建议?我真的不知道如何解决这个问题.
解决方法
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,900913)’)“)
PostGIS认为您正在尝试提交格式不正确的字符串,并在其中间使用未转义的单引号.
切换查询字符串构建器以执行此操作应该有效:
var query = client.query(“INSERT INTO pins(p_geom)values(”pra“)”)
但是不要这样做
您现在正在打开sql注入攻击,因为有人可能会破解HTTP请求以发送偷偷摸摸的东西而不是您期望的几何WKT.不要使用字符串连接将来自Web浏览器的输入嵌入到数据库查询中,因为它绕过了框架的某些安全功能.
现在,回到第一次尝试使用参数化查询:
node.js库正在尝试准备您的参数以便插入到数据库中,并将其视为一个String,用单引号将其包围,并转义所有嵌入的单引号.这会导致查询发送到PostGIS,如下所示:
INSERT INTO引脚(p_geom)值(‘ST_GeomFromText(”LInesTRING(2335859.0225 4725430.1340625,2378933.155 4741356.7040625)”,900913)’)
PostGIS然后通过解析它来帮助尝试将字符串转换为几何体,并抱怨有效的几何体不会以“ST”开头
而不是将ST_GeomFromText(…)作为String参数传递,只需传递实际上是字符串的查询部分–WKT.像这样的东西:
var wkt =“LInesTRING(”geo“)”;
var query = client.query(‘INSERT INTO pins(p_geom)values(ST_GeomFromText(?,900913))’,[wkt])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。