es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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ón ST_GeomFromText recibe directamente una cadena que contiene el punto, mientras que en la consulta de JavaScript, se está pasando una variable location 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ón ST_GeomFromText la pueda leer. Esto se puede lograr construyendo la cadena que contiene el punto dentro de la consulta de esta manera:

    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, strenght, location]);
    

    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ón ST_GeomFromText lea correctamente el parámetro location 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.

Comments are closed.