2013-07-22 14 views
12

Quindi ora sto giocando con NodeJS/Express per un po 'e mi piacerebbe davvero provare a riscrivere un progetto laterale relativamente grande utilizzando uno stack JavaScript completo solo per vedere come funzionerà. Sails.js sembra essere una scelta piuttosto buona per un backend NodeJS per un'API REST con supporto per i socket Web, che è esattamente quello che sto cercando, ma è un altro problema che sto cercando di risolvere e che è SQL transazionale all'interno di NodeJS.SQL transazionale con Sails.js

La maggior parte del livello dati/file che ho visto sul lato NodeJS non sembra supportare le transazioni quando si ha a che fare con MySQL. Anche l'ORM fornito con Sails.js (Waterline) non sembra supportare transazioni che sono strane perché ho visto i luoghi in cui è menzionato, anche se quei commenti sono piuttosto vecchi. Knex.js ha il supporto per le transazioni quindi mi chiedevo se è facile sostituire l'ORM è Sails.js con questo (o se Sails.js assume Waterline nel core framework).

Mi chiedevo anche se c'è un ORM costruito su Knex.js oltre a Bookshelf perché non sono un fan del sistema Modello/Collezione Backbones?

+0

Curioso ciò che si pensa potrebbe essere migliorato nel sistema Modello/Collezione o cosa non ti piace su di esso. – tgriesser

risposta

6

Stiamo lavorando su un supporto nativo per le transazioni a livello ORM: https://github.com/balderdashy/waterline/issues/62

Associazioni probabilmente verrà prima, ma le operazioni sono accanto. Abbiamo appena terminato GROUP BY e aggregazioni (SUM, AVG, ecc.)

+1

qual è lo stato di questo ... Sono interessato solo alle transazioni con adattatore singolo su più tabelle ... Vedo documentazione che dice che la linea di galleggiamento ha transazioni ma nessuna elaborazione su tale affermazione .. o documentazione su come usarlo. – jonasfj

+0

Come si esegue effettivamente il gruppo? Ctrl + f su entrambe le documentazioni della linea di galleggiamento e la documentazione delle vele mostra risultati zero. Un rapido esempio sarebbe fantastico. – Kory

17

È ancora possibile scrivere query SQL direttamente utilizzando Model.query(). Poiché si tratta di una funzione asincrona, è necessario utilizzare le promesse o async per resettializzarlo. Ad esempio, utilizzando l'adattatore di MySQL, async, e un modello chiamato User:

async.auto({ 
    transaction: function(next){ 
    User.query('BEGIN', next); 
    }, 
    user: ['transaction', function(next) { 
    User.findOne(req.param('id')).exec(next); 
    }], 
    // other queries in the transaction 
    // ... 
}, function(err, results) { 
    if (err) { 
    User.query('ROLLBACK', next); 
    return next(err); 
    } 
    User.query('COMMIT', next); 
    // final tasks 
    res.json(results.serialize); 
}); 
+0

Questo potrebbe non funzionare quando il pool di connessioni è abilitato. Non dovresti eseguire BEGIN, ROLLBACK e COMMIT su connessioni separate. –

+0

Non funzionerà per la chiamata simultanea multipla –

1

Le operazioni in SailsJS si è rivelato molto più difficile del previsto. L'obiettivo è di far sapere all'adattatore ORM che due azioni del controllore molto disparate sui modelli devono essere inviate attraverso una singola connessione MySQL.

Il modo naturale per farlo è scrivere un nuovo adattatore che accetti informazioni aggiuntive per indicare che una query appartiene a una chiamata di transazione. Per fare ciò è necessario modificare lo stesso waterline (modulo di astrazione ORM delle vele).

Checkout se questo aiuta - https://www.npmjs.com/package/sails-mysql-transactions

Problemi correlati