#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);
для справки вы можете посетить этот веб-сайт, пожалуйста
, нажмите здесь