Почему только жестко запрограммированные запросы не возвращают ошибку при вызове client.запрос в node-postgres?

#node.js #postgresql #node-postgres

#node.js #postgresql #node-postgres

Вопрос:

Я извлекаю SQL-запрос с веб-страницы с помощью puppeteer. Когда я передаю обработанный запрос в метод запроса клиента node-postgres, я всегда получаю ошибку syntax error at or near "." .

Когда я консоль.войдите в запрос и введите жесткий код в клиент.запрос (), он работает нормально. Я ни за что на свете не могу понять, почему работает только жестко запрограммированный запрос.

Я пытался использовать pg-escape, используя строку в долларовых кавычках для передачи запроса, удаляя пробелы и новые строки.

Итак, в сценариях:

puppeteer gets sql from webpage => parse and pass to node-postgres => get an error

puppeteer gets sql from webpage => parse and pass to console.log => manually copy and paste the query into a var => run the query with node-postgres => query success

Это запрос, который я получаю при консоли.запишите извлеченный текст с веб-страницы (это после того, как я его очищу):

 SELECT
     cp.name AS category_page,
     cp.id AS category_page_id,
     cp.url AS category_page_url,
     ARRAY_AGG( DISTINCT g.name) AS projects,
     cp.created_by,
     date_trunc('day', (cp.created_date)::timestamp)::date AS created_date,
     cp.modified_by,
     date_trunc('day', (cp.modified_date)::timestamp)::date AS modified_date,
     cp.qa_by,
     date_trunc('day', (cp.qa_date)::timestamp)::date AS qa_date,
     cp.is_terminated,
     cp.annotation
 FROM ulta.category_page cp
 LEFT JOIN (SELECT c.*, a.name FROM ulta.category_page_to_ref_resource_group c
    LEFT JOIN ref.resource_group a ON a.id = c.ref_resource_group_id) AS g
 ON g.category_page_id = cp.id
 WHERE (g.ref_resource_group_id='109')
   AND (cp.id='4')
 GROUP BY cp.id
 ORDER BY cp.name
 limit 5000
 

Я запускаю:

 console.log(query)
try {
     const results = await postgres.query(query);
     console.log(results);
} catch(err) {
     console.error(err);
}
 

Когда я бросаю это в отладчик и прерываю запрос, единственное различие, которое я нахожу, заключается n в том, что они не удаляются. В противном случае это выглядит точно так же.

Любая помощь приветствуется! Я предполагаю, что это как-то связано с тем, как console.log печатает строку и как node-postgres обрабатывает строки.

Редактировать

Добавление консоли.регистрируйте результаты JSON.stringify в комментарии:

 " SELECTn     cp.name AS category_page,n     cp.id AS category_page_id,n     cp.url AS category_page_url, n     ARRAY_AGG( DISTINCT g.name) AS projects,n     cp.created_by, n     date_trunc('day', (cp.created_date)::timestamp)::date AS created_date,n     cp.modified_by, n     date_trunc('day', (cp.modified_date)::timestamp)::date AS modified_date,n     cp.qa_by, n     date_trunc('day', (cp.qa_date)::timestamp)::date AS qa_date, n     cp.is_terminated,n     cp.annotationn FROM ulta.category_page cpn LEFT JOIN (SELECT c.*, a.name FROM ulta.category_page_to_ref_resource_group cn    LEFT JOIN ref.resource_group a ON a.id = c.ref_resource_group_id) AS gn ON g.category_page_id = cp.idn WHERE (g.ref_resource_group_id='109')n AND (cp.id='4')n GROUP BY cp.idn ORDER BY cp.namen limit 5000n"
 

РЕДАКТИРОВАТЬ 2
После анализа sql-запроса с помощью JSON.stringify я смог найти виновных. Я добавил:

         const parsedQuery = JSON.stringify(query)
        .replace(/\n/g, '')
        .replace(/"/g, '')
        .replace(/s{4,5}/g, ' ')
        .trim()
 

Что решило проблему. Я все еще не уверен, зачем это нужно.

Комментарии:

1. Не могли бы вы включить необработанный результат console.log(JSON.stringify(query)) прямо перед postgres.query строкой?

2. @sachav Я обновил свой пост с помощью консоли. журнал JSON.stringify

3. Вы можете безопасно стерилизовать и подготовить свой SQL с помощью pg-minify 😉