Nel caso tu stia utilizzando Express + Sequelize, puoi farlo utilizzando un modulo chiamato continuation-local-storage
(d'ora in poi cls
, per brevità).
Mostrami il codice
// When initializing your Sequelize instance
var Sequelize = require( "sequelize" );
Sequelize.cls = require( "continuation-local-storage" ).createNamespace( "db" );
module.exports = new Sequelize(...);
Quindi, crea qualche middleware per inizializzare la tua transazione in ogni richiesta (nel caso nessuno ne abbia ancora trovata una):
var sequelize = require(...);
app.use(function ( req, res, next ) {
sequelize.transaction(function () {
// Do something else, but be sure to invoke next middleware
next();
});
});
Che sta succedendo qui?
- Viene dichiarato uno spazio dei nomi
cls
per Sequelize da utilizzare. Deve essere impostato sul costruttore;
- Una transazione viene inizializzata in un middleware Express;
- Ogni query sequelize successiva utilizzerà la transazione richiesta per impostazione predefinita (è possibile sovrascrivere questo comportamento, ovviamente).
Come funziona?
Funziona perché cls
assegna un nuovo spazio di archiviazione per ogni nuova catena asincrona (la richiesta in questo esempio) e vengono trasmessi in modo coerente e trasparente.
È una specie di magia che accade all'interno del nodo:)
Consigli
È molto probabile che dovrai utilizzare alcuni monkeypatch per adottare tale approccio. Dipende dall'implementazione di Promises.
Ulteriori informazioni
Controlla la documentazione di Sequelize .