为什么在node-postgres中调用client.query时,仅硬编码查询不返回错误?

时间:2019-04-14 17:59:54

标签: node.js postgresql node-postgres

我正在使用puppeteer从网页中提取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

根据注释添加JSON.stringify的console.log结果:

" 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 用JSON.stringify解析sql查询后,我找到了罪魁祸首。我加了:

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

解决了这个问题。我仍然不确定为什么需要这样做。

0 个答案:

没有答案