Перебор массива с запросами PostgreSQL

#javascript #node.js #postgresql

#javascript #node.js #postgresql

Вопрос:

Я пытаюсь сохранить содержимое массива в своей базе данных. Я хочу добавить новую строку для каждого элемента в массиве. В настоящее время я запускаю:

 router.post('/saveVenueMatches', (req, res) => {
  const id = req.body.user_id;
  const data = req.body.data;
  res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');
  for (const venue of data) {
    let sqlText = `INSERT INTO user_matches (user_id, venue_id) VALUES ($1, $2)`;
    pool
      .query(sqlText, [id, venue.id])
      .then((response) => {
        res.send(response.rows);
      })
      .catch((err) => {
        console.log('Error saving venue matches', err);
      });
  }
});
  

Это приводит к успешным отправкам в мою базу данных, однако мой сервер возвращает следующую ошибку один раз для каждого элемента в массиве:

 Error saving venue matches Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
{
  code: 'ERR_HTTP_HEADERS_SENT'
}
  

Я попытался удалить строку, в которой я установил заголовок, но все равно получаю сообщение об ошибке. Я не совсем уверен, что является причиной этого.

Кроме того, если есть лучший способ сделать подобный запрос, пожалуйста, дайте мне знать.

Ответ №1:

Вы пытаетесь отправить результат клиенту на каждой итерации цикла, но вы можете сделать это только один раз. Попробуйте отправить результаты после цикла или лучше превратить цикл в Promise.all вызов

Ответ №2:

Мое предложение будет заключаться в том, чтобы использовать несколько вставок одновременно, не пытайтесь обращаться к базе данных слишком много раз.

Вы можете использовать эти пакеты npm для одновременной вставки нескольких

 const pg = require('pg');
const format = require('pg-format');
  

вам нужно просто соответствующим образом отформатировать свои данные

 let user_matches = [[1, 2], [2, 3]];
let query1 = format('INSERT INTO users (user_id, venue_id) VALUES %L returning id', user_matches);
let {rows} = await client.query(query);
  

для справки вы можете посетить этот веб-сайт, пожалуйста
, нажмите здесь