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