Как вставить данные в таблицу с lastID из предыдущей вставки в SQLite3 с помощью Node.js ?

#node.js #sqlite #rest

#node.js #sqlite #отдых

Вопрос:

У меня есть RESTAPI express.js и node.js для вставки данных в базу данных SQLite3.

Первая вставка — это оператор add, а затем извлечение lastID , чтобы вставить его в другую таблицу.

     router.post('/addStatement', function(req, res){

    const data = req.body;
    let corporate_statement_link_id = null;

    let statement_link_exist_query = `SELECT * FROM search_results WHERE company_id = ? and link = ?;`;
    let query = `INSERT INTO search_results (company_id, title, link, domain) VALUES(?,?,?,?)`
    let corp_query = `INSERT INTO corporate_statements (corporate_statement_link_id, corporate_statement) VALUES(?,?)`;
        
    db.all(statement_link_exist_query, [data.company_id, data.link], (err, row) => { 
        if (err){
            console.log('error: ', err)
            res.sendStatus(err.status).send(err);
        }

        if(row.length > 0){
            res.sendStatus(409).send("Link already exists");
        } 
        
        let insertStmt = db.prepare(query, [data.company_id, data.title, data.link, data.domain]);
        
        insertStmt.run(err => {
            if (err){
                console.log('error: ', err);
                res.sendStatus(err.status).send(err);
            }
            console.log("Last ID: ", insertStmt.lastID);
        
            let insertIDToScrapeData = db.prepare(corp_query, [insertStmt.lastID, 1]);
        
            insertIDToScrapeData.run(err => {
                if(err){
                    console.log('error: ', err);
                    res.sendStatus(err.status).send(err);
                }
                
            });

            corporate_statement_link_id = insertIDToScrapeData.lastID;
        });
        console.log("Scrape ID: ", corporate_statement_link_id);
        res.send(JSON.stringify(corporate_statement_link_id));
    });
    
 });
 

Но я продолжаю получать следующую ошибку:

 Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
 

Как я могу это исправить?

Комментарии:

1. это ошибка ExpressJS, сообщающая вам, что вы уже отправили данные обратно (вероятно, с res.sendStatus() помощью), и вы делаете это снова, вероятно, с res.send() помощью … попробуйте отправить что-то обратно только один раз

2. @balexandre, это та часть, которую я не понимаю. Потому что это не приводит к ошибке res.sendStatus() . Я прочитал в сообщении SO, на которое сейчас не могу найти ссылку, но в нем что-то говорилось о двойной вставке данных, и именно это вызывает ошибку. Но мне нужно вставить данные в одну таблицу и получить идентификатор из вставленной таблицы для вставки в другую таблицу.

3. но ошибка, о которой вы сообщаете, не имеет ничего общего с базой данных, я уверен, что вы не опубликовали весь код… запустите в режиме отладки, нажмите на эту конечную точку и просмотрите строку за строкой, чтобы увидеть, что происходит. первое, что вы должны сделать, это изменить return res.status(...) , чтобы он больше ничего не обрабатывал. Вызов res.status or res.send не останавливает обработку остальных, вам необходимо return

4. @balexandre, понял! Спасибо, что разъяснили это для меня. Имеет смысл перечитать ваш комментарий сейчас. Я попробую это сделать.

5. видите, это не было связано с базой данных, просто поймите ошибку, и все в порядке. счастливого программирования! 😊