Consulta PG en JavaScript no reconoce el tipo geométrico POINT de PostGIS.
Estoy teniendo problemas para ejecutar una consulta que funciona directamente en psql con la extensión postgis, pero no con la conexión de la biblioteca pg de Javascript dentro de una declaración preparada.
La consulta que se ejecuta y se escribe en la base de datos es la siguiente:
INSERT INTO waps (bssid, strength, "location")
VALUES ('T_601', '100', ST_GeomFromText('POINT(38.70722651513132, -9.15248591105515)', 4326));
La tabla waps tiene la columna location como tipo geometry.
En mi proyecto de Javascript de la universidad, tengo esta sección de código que devuelve un error:
let sql = "INSERT INTO waps (bssid, strength, location) VALUES ($1, $2, ST_GeomFromText('POINT($3)', 4326)) RETURNING id";
let wapId = await pool.query(sql, [bssid, strength, location]);
location
recibe, por ejemplo: "38.70722651513132, -9.15248591105515"
, y devuelve un error:
{
error: function point(unknown) is not uniqueupLog Completed in 2ms
at Parser.parseErrorMessage (project/node_modules/pg-protocol/dist/parser.js:287:98)
at Parser.handlePacket (project/node_modules/pg-protocol/dist/parser.js:126:29)
at Parser.parse (project/node_modules/pg-protocol/dist/parser.js:39:38)
at Socket.stream.on (project/node_modules/pg-protocol/dist/index.js:11:42)
at Socket.emit (events.js:198:13)
at addChunk (stream_readable.js:288:12)
at readableAddChunk (stream_readable.js:269:11)
at Socket.Readable.push (stream_readable.js:224:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
length: 195,
name: 'error',
severity: 'ERROR',
code: '42725',
detail: undefined,
casts.'',
position: '76',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_func.c',
line: '572',
routine: 'ParseFuncOrColumn'
}
Entonces, ¿por qué la consulta en psql se ejecuta normalmente pero cuando se prepara en un entorno de Javascript, arroja un error?
El problema generalmente radica entre la pantalla y la silla, por lo que se agradece cualquier ayuda.
davy.ai
El error parece estar ocurriendo porque el parámetro
location
no se está pasando correctamente a la consulta. En la consulta que funciona, la funciónST_GeomFromText
recibe directamente una cadena que contiene el punto, mientras que en la consulta de JavaScript, se está pasando una variablelocation
que contiene una cadena en el formato"38.70722651513132, -9.15248591105515"
.Para solucionar este error, es necesario modificar la consulta de JavaScript para formatear correctamente el parámetro
location
y que la funciónST_GeomFromText
la pueda leer. Esto se puede lograr construyendo la cadena que contiene el punto dentro de la consulta de esta manera:La consulta anterior utiliza la concatenación de cadenas para construir la cadena completa de
POINT
dentro de la consulta en sí. Esto debería permitir que la funciónST_GeomFromText
lea correctamente el parámetrolocation
e inserte los datos en la base de datos.Siempre es una buena idea sanitizar los datos de entrada para evitar ataques de inyección SQL. Dependiendo de su biblioteca específica, puede utilizar declaraciones preparadas o consultas parametrizadas para sanitizar la entrada del usuario.