Почему только жестко закодированные запросы не возвращают ошибку при вызове client.query в node-postgres? - PullRequest
0 голосов
/ 14 апреля 2019

Я извлекаю 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()

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

...