Как мне вставить массив в несколько строк в psql с помощью knexjs

Я использую транзакцию outta knexjs для вставки значений в 2 таблицы (1. результат, 2. детали результата). при вставке значений в таблицу 2 (resultdetail) у меня есть массив объектов, размер которых зависит от каждой записи (в зависимости от количества субъектов).

{
	"name": "Sally",
	"fathername": "John",
	"rollno": "85a76",
	"classname": "class1",
	"detail": [
		{
			"subject": "History",
			"marksobt": "50",
			"totalmarks": "100"
		},
		{
			"subject": "French",
			"marksobt": "75",
			"totalmarks": "75"
		}
	]
}

Я пытаюсь сделать это по следующему коду. (Опять же, размер массива "деталей" зависит от количества субъектов)

const { name, fathername, rollno, classname } = req.body;
	db.transaction(trx => {
		db.insert({
			name: name,
			fathername: fathername,
			rollno: rollno,
			classname: classname
		}).into('results')
		.transacting(trx)
		.returning('rollno')
		.then(roll_no => {
			req.body.detail.map(result => {
				return trx('resultdetail')
				.returning('*')
				.insert({
					rollno: roll_no[0],
					subject: result.subject,
					marksobt: result.marksobt,
					totalmarks: result.totalmarks
				}).then(console.info)
			})
		})
		.then(trx.commit)
		.catch(trx.rollback)
	})
	.catch(err => res.status(400).json(err))
But end up getting following error.

Unhandled rejection Error: Transaction query already complete, run with DEBUG=knex:tx for more info
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
insertedRows = await knex('results').returning('*').insert([
    {
        "subject": "History",
        "marksobt": "50",
        "totalmarks": "100"
    },
    {
        "subject": "French",
        "marksobt": "75",
        "totalmarks": "75"
    }
]);

Но в основном ваша проблема в том, что вы запускаете несколько запросов + фиксируете одновременно, не дожидаясь готовности более ранних запросов ...

Когда вы добавляете что-то во вторую таблицу, это должно быть примерно так:

.then(roll_no => {
  let resultsToAdd = req.body.detail.map(result => {
     return {
       rollno: roll_no[0],
       subject: result.subject,
       marksobt: result.marksobt,
       totalmarks: result.totalmarks
     };
   });

   return return trx('resultdetail')
     .returning('*')
     .insert(resultsToAdd);
})

Другие вопросы по теме