Transações interdependentes com pg-promessa

Estou tentando criar um aplicativo envolvePostagens eTag para postagens. Para estes eu tenho umpost, tags epost_tag mesa.tags tem as tags que eu defini anteriormente e em algum lugar do aplicativo é sugerido ao usuário no front-end.post_tag tabela contém opostar eetiqueta, rótulo, palavra-chave ids como pares em cada linha.

Eu uso express.js e postgreql e pg-promessa.

Tanto quanto sei, preciso de uma consulta transacional para uma operação de criação de postagem.

Também preciso de um mecanismo para detectar se umetiqueta, rótulo, palavra-chave não estava emtags tabela quando o usuário criou a postagem, para que eu possa inseri-la em tempo real e tenha umtag_id para cadaetiqueta, rótulo, palavra-chave que é necessário usar eminsertion dopost_id etag_id para dentropost_tag mesa. Caso contrário, terei umforeign key error desde que eu precisopost_tag colunas da tabelapost_id etag_id referenciarposts etags mesaid colunas, respectivamente.

Aqui está a função de URL que eu uso para isso que usei até agora sem êxito:

privateAPIRoutes.post('/ask', function (req, res) {
    console.log('/ask req.body: ', req.body);
    // write to posts
    var post_id = ''
    var post_url = ''
    db.query(
        `
            INSERT INTO
                posts (title, text, post_url, author_id, post_type)
            VALUES
                ($(title), $(text), $(post_url), $(author_id), $(post_type))
            RETURNING id
        `,
        {
            title: req.body.title,
            text: req.body.text,
            post_url: slug(req.body.title),
            author_id: req.user.id,
            post_type: 'question'
        } // remember req.user contains decoded jwt saved by mw above.
    )
        .then(post => {
            console.log('/ask post: ', post);
            post_id = post.id
            post_url = post.post_url


            // if tag deos not exist create it here
            var tags = req.body.tags;
            console.log('2nd block tags1', tags);
            for (var i = 0; i < tags.length; i++) {
                if (tags[i].id == undefined) {
                    console.log('req.body.tags[i].id == undefined', tags[i].id);                        
                    var q1 = db.query("insert into tags (tag) values ($(tag)) returning id", {tag: tags[i].label})
                                .then(data => {
                                    console.log('2nd block tags2', tags);
                                    tags[i].id = data[0].id 


                                    // write to the post_tag
                                    db.tx(t => {
                                        var queries = [];
                                        for (var j = 0; j < tags.length; j++) {

                                            var query = t.query(
                                                `
                                                    INSERT INTO
                                                        post_tag (post_id, tag_id)
                                                    VALUES
                                                        ($(post_id), $(tag_id))
                                                `,
                                                {
                                                    post_id: post_id,
                                                    tag_id: tags[j].id
                                                }
                                            )
                                            queries.push(query);
                                        }   
                                        return t.batch(queries)
                                    })
                                        .then(data => {
                                            res.json({post_id: post_id, post_url: post_url})
                                        })
                                        .catch(error => {
                                            console.error(error);
                                        })
                                })
                                .catch(error => {
                                    console.error(error);
                                });
                }
            }
        })
        .catch(error => {
            console.error(error);
        })
});

questionAnswers(1)

yourAnswerToTheQuestion