Transacciones interdependientes con pg-promise

Estoy tratando de construir una aplicación implicapublicaciones yetiquetas para publicaciones Para estos tengo unpost, tags ypost_tag mesa.tags tiene las etiquetas que he definido de antemano y en algún lugar de la aplicación se sugiere al usuario en el front-end.post_tag la mesa sostiene elenviar yetiqueta ids como pares en cada fila.

Yo uso express.js y postgreql y pg-promise.

Hasta donde sé, necesito una consulta (s) transaccional (es) para una operación de creación posterior.

También necesito un mecanismo para detectar si unetiqueta no estaba entags tabla cuando el usuario creó la publicación, para que pueda insertarla sobre la marcha, y tengo untag_id para cadaetiqueta que es necesario usar eninsertion delpost_id ytag_id dentropost_tag mesa. De lo contrario, tendré unforeign key error ya que necesitopost_tag columnas de la mesapost_id ytag_id referirseposts ytags mesaid columnas, respectivamente.

Aquí está la función de URL que uso para esto que he usado hasta ahora sin é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);
        })
});

Respuestas a la pregunta(1)

Su respuesta a la pregunta