Я извлекаю SQL-запрос из веб-страницы с помощью кукловода.Когда я передаю проанализированный запрос в метод клиентского запроса node-postgres, я всегда получаю ошибку syntax error at or near "."
.
Когда я console.log запрос и жесткий код в client.query (), он работает нормально.Я не могу понять, почему работает только жестко закодированный запрос.
Я пытался использовать 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
Это запрос, который я получаю, когда я console.log извлекаеттекст с веб-страницы (это после того, как я его почистил):
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 обрабатывает строки.
EDIT
Добавление в файл console.log результатов JSON.stringify для комментария:
" SELECT\n 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.annotation\n FROM ulta.category_page cp\n LEFT JOIN (SELECT c.*, a.name FROM ulta.category_page_to_ref_resource_group c\n LEFT JOIN ref.resource_group a ON a.id = c.ref_resource_group_id) AS g\n ON g.category_page_id = cp.id\n WHERE (g.ref_resource_group_id='109')\n AND (cp.id='4')\n GROUP BY cp.id\n ORDER BY cp.name\n limit 5000\n"
РЕДАКТИРОВАТЬ 2 После анализа запроса sql с помощью JSON.stringify Iудалось найти виновных.Я добавил:
const parsedQuery = JSON.stringify(query)
.replace(/\\n/g, '')
.replace(/"/g, '')
.replace(/\s{4,5}/g, ' ')
.trim()
Что решило проблему.Я до сих пор не уверен, зачем это нужно.