Вы должны создать соединение с базой данных вне функции задачи:
const { Client } = require('pg');
const client = new Client(/* ... */);
await client.connect();
Затем вы запрашиваете данные и ставите их в очередь (с идентификатором, чтобы иметь возможность сохранить его в базе данных позже):
const rows = await pool.query('SELECT id, url FROM your_table WHERE ...');
rows.forEach(row => cluster.queue({ id: row.id, url: row.url }));
И затем, в конце функции задачи, вы обновляете строку таблицы.
await cluster.task(async ({ page, data: { id, url, id } }) => {
// ... run puppeteer and save results in content variable
await pool.query('UPDATE your_table SET content=$1 WHERE id=$2', [content, id]);
});
В целом ваш код должен выглядеть следующим образом (знайте,что я сам не проверял код):
const { Cluster } = require('puppeteer-cluster');
const { Client } = require('pg');
(async () => {
const client = new Client(/* ... */);
await client.connect();
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_CONTEXT,
maxConcurrency: 2,
});
await cluster.task(async ({ page, data: { id, url } }) => {
await page.goto(url);
const content = await page.content();
await pool.query('UPDATE your_table SET content=$1 WHERE id=$2', [content, id]);
});
const rows = await pool.query('SELECT id, url FROM your_table');
rows.forEach(row => cluster.queue({ id: row.id, url: row.url }));
await cluster.idle();
await cluster.close();
})();