2013-07-01 10 views
6

Chiunque ha un modulo di migrazione che usano per migrare i dati di mongodb con il plugin mangusta?Migra migrare

Attualmente sto usando il modulo 'migrate' e funziona benissimo tranne per il fatto che ho bisogno di creare/distruggere la mia connessione in ogni su/giù.

I.E.

// Setup mongoose 
var mongoose = require('mongoose') 
    , Role = require('../models/role') 
    , User = require('../models/user'); 

exports.up = function(next) { 
    // get a brand new connection for this patch. 
    mongoose.connect('mongodb://localhost/sagedb'); 

    var adminUser = { 
    username: 'admin', 
    password: 'admin' 
    }; 

    User.createUser(adminUser, function(err, user) { 
    if (err) { 
     mongoose.disconnect(); // Make sure to close connection 
     return next(err); 
    } 

    mongoose.disconnect(next); // Make sure to close connection 
    }); 
}; 

exports.down = function(next) { 
    mongoose.connect('mongodb://localhost/sagedb'); // new connection for down 

    User.getUserByUsername('admin', function(err, user) { 
    if (err) { 
     mongoose.disconnect(function() { // make sure to close connection 
     return next(err); 
     }); 
    } 

    if (!user) { 
     mongoose.disconnect(); // make sure to close connection 
     return next(); 
    } 

    User.deleteUser(user, function(err, user) { 
     console.log('deleted user'); 
     mongoose.disconnect(next); // make sure to close connection 
    }); 
    }); 
}; 

Probabilmente un modo molto migliore per farlo. Mi chiedo se l'unica opzione è creare il mio modulo che avvia la connessione una volta e la chiude quando tutte le patch sono complete.

Ho visto migrare mongoose che tiene traccia della migrazione nella raccolta del database. Non proprio specifico per IMHO mangusta, preferirei comunque utilizzare il file .migrate, ma solo aprire la connessione una volta.

risposta

2

Il motivo del problema è che la connessione è "connessa" ogni volta, su ogni migrazione Ecco perché è necessario disconnettersi. La stessa situazione se si sostituisce connettersi con mongoose.createConnection. dovrai chiuderlo.

Come risolvere?

mossa

var mongoose = require('mongoose') 
     , Role = require('../models/role') 
     , User = require('../models/user'); 

nel modulo come db

var mongoose = require('mongoose') 
     , Role = require('../models/role') 
     , User = require('../models/user'); 
module.exports = mongoose  

ed appena lo richiedono

 var mongoose = require('./db') 

Così si avrà:

  • singola connessione
  • Tutti i modelli caricati in un unico luogo
  • codice pulito in migrazioni
0

Potete anche provare il mio quadro migrazione migrate-mongoose che provvede alla connessione mangusta destra, fuori dalla scatola.

nella funzione up o down si può semplicemente accedere ai modelli come questo

this('user').findOne({ name: 'Sergey' }); 

Persiste anche i vostri migrazioni al database al posto del file system.

0

Hai anche quadro migrazione est che è molto potente e ha anche MongoDB adattatori: https://github.com/okv/east

quindi si migrazione cassa con il comando:

east create my_migration_name 

E poi i tuoi script di migrazione sarà simile this:

exports.migrate = function(client, done) { 
    var db = client.db; 
    db......... 
    done(); 
}; 

exports.rollback = function(client, done) { 
    var db = client.db; 
    db......... 
    done(); 
};