Interdependente Transaktionen mit pg-promise

Ich versuche, eine App zu erstellen, bei der posts undStichwort für Beiträge. Für diese habe ich einpost, tags undpost_tag Tabelle.tags hat die Tags, die ich vorher definiert habe und in irgendwo in der App wird dem Benutzer am Frontend vorgeschlagen.post_tag Tabelle enthält dasPos undEtiket ids als Paare in jeder Zeile.

Ich benutze express.js und postgreql und pg-promise.

Soweit ich weiß, benötige ich eine Transaktionsabfrage (n) für eine Operation zum Erstellen eines Posts.

Auch ich brauche einen Mechanismus, um festzustellen, ob einEtiket war nicht intags Tabelle, als der Benutzer den Beitrag erstellt hat, damit ich ihn sofort einfügen kann, und ich habe eintag_id für jedesEtiket das muss in @ verwendet werdinsertion despost_id undtag_idinpost_tag Tabelle. Ansonsten bekomme ich einforeign key error da muss ichpost_tag table's Spaltenpost_id undtag_id referenzierenposts undtags Tabelleid Spalten.

Hier ist die URL-Funktion, die ich dafür benutze, die ich bisher erfolglos benutzt habe:

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);
        })
});

Antworten auf die Frage(2)

Ihre Antwort auf die Frage