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