6

Avvio di learn node.js e backbone.js e sto utilizzando l'esempio TodoMVC come guida. Ci sono un paio di parti che ho problemi a sistemarmi la testa. Vedi sotto.Informazioni su TodoMVC Esempio

Qui è app.js.

var express = require('express') 
    , http = require('http') 
    , mongoose = require('mongoose') 
    , models = require('./models') 
    , routes = require('./routes') 
    , app = express(); 

app.configure(function() { 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(require('stylus').middleware({ src: __dirname + '/public' })); 
    app.use(express.static(__dirname + '/public')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
}); 

app.configure('development', function() { 
    app.use(express.errorHandler()); 
}); 

routes.init(app); 


mongoose.connect("127.0.0.1", "todomvc", 27017); 

http.createServer(app).listen(3000); 

console.log("Express server listening on port 3000"); 

Heres è ./models:

var mongoose = require('mongoose'), 

    TodoSchema = new mongoose.Schema({ 
    title: { 'type': String, 'default': 'empty todo...' }, 
    order: { 'type': Number }, 
    done: { 'type': Boolean, 'default': false } 
    }); 

module.exports = mongoose.model('Todo', TodoSchema); 

Andy finalmente, qui è ./routes:

(function (exports) { 

    "use strict"; 

    var mongoose = require('mongoose') 
    , crudUtils = require('../utils/crudUtils') 
    , Todo = mongoose.model('Todo'); 

    function index(req, res) { 
    res.render('index', { 'title': 'Backbone.js, Node.js, MongoDB Todos' }); 
    } 

    exports.init = function (app) { 
    app.get('/', index); 
    crudUtils.initRoutesForModel({ 'app': app, 'model': Todo }); 
    }; 

}(exports)); 

Quindi la mia domanda è, come è il modello 'Todo' in mangusta .model ('Todo') nel modulo rotte disponibile in questo ambito? Vedo che il modulo dei modelli sta esportando mongoose.model ('Todo', TodoSchema); quindi devo credere che sia il modo in cui il modulo dei percorsi ha accesso ad esso, ma non so perché. Cosa mi manca? Ho la sensazione che non sia una completa comprensione dell'ambito in questa situazione. Inoltre, non sono sicuro del motivo per cui le rotte funzionano in modo anonimo.

Grazie mille!

risposta

8

Questa è una delle cose più confuse da affrontare quando si inizia in Node e Mongoose.

Quando si emette il require('mongoose') per la prima volta, viene creata un'istanza singleton di Mangusta - la stessa istanza viene restituita ogni volta successiva che viene richiesta.

Questo lo rende davvero facile da usare, ma è un po '"magico" che è difficile da capire all'inizio.

Significa che quando si chiama mongoose.connect("127.0.0.1", "todomvc", 27017); in app.js, viene creata una connessione che persiste con l'app.

Significa anche che mongoose.model('Todo', TodoSchema); rende il modello Todo disponibile in qualsiasi altro ambito che chiama require('mongoose'), tramite mongoose.model('Todo'). Questo potrebbe essere var'd nella parte superiore di un altro file che è require come nell'esempio sopra, o nel momento in cui ne hai bisogno nel bel mezzo di una richiamata.

Ecco come si ottiene il modello Todo nel tuo routes.js, e un ottimo motivo per assicurarti di dire a Mongoose dei tuoi modelli è una delle prime cose che fai nella tua applicazione.

Per rispondere alle domande relative alla comprensione degli ambiti; ogni file che hai require ha un proprio ambito e non ha accesso a nulla tranne oggetti globali come il processo.Devi require tutto ciò con cui vuoi lavorare e puoi solo passare le variabili chiamando funzioni o creando classi che sono esposte tramite l'oggetto exports.

Quindi, per l'esempio sopra riportato, non vi è alcun vantaggio nell'esportazione del modello da models.js poiché non viene successivamente indicato nell'app. Dove è richiesto models.js. Sono queste righe in routes.js che rendono il modello Todo disponibili:

var mongoose = require('mongoose') 
, Todo = mongoose.model('Todo'); // returns the Todo model that was registered by models.js 

Ecco come Todo esiste su questa linea:

crudUtils.initRoutesForModel({ 'app': app, 'model': Todo }); 

C'è anche alcun beneficio (per quanto ne so) che avvolge il rotte in una funzione anonima poiché ciò è essenzialmente fornito da require.

+0

Grazie mille! Questo chiarisce molto. Tuttavia, se commento "module.exports = mongoose.model ('Todo', TodoSchema);' nei model.js, l'app non funziona dicendo "Lo schema non è stato registrato per il modello 'Todo'." Potrebbe essere necessario che lo schema sia disponibile per le future esigenze di mangusta? –

+0

Ci scusiamo, per essere più chiari, è necessaria la parte 'mongoose.model ('Todo', TodoSchema ')'. Questo è il bit che registra il modello con mangusta e lo rende successivamente disponibile. Intendevo dire che puoi saltare la parte 'module.exports =', dal momento che non stai usando ciò che stai esportando. Inoltre, dovresti usare 'exports.todoModel = ...' se vuoi aggiungere altri modelli a quel file .js ed esportarli tutti, vedi http://stackoverflow.com/questions/5311334/what-is -il-scopo-di-nodejs-module-exports-and-how-do-you-use-it/12907839 # 12907839 per ulteriori informazioni sull'esportazione dai moduli. –

+0

Ottimo! Grazie per la tua risposta! Questo chiarisce molto. –

0

Stai per voler controllare Express.

Express è un framework di applicazioni Web node.js minimale e flessibile, che fornisce un set completo di funzionalità per la creazione di applicazioni Web singole e multipagina e ibride.

Molto di ciò che si copia e incollato sta usando l'espresso Scaffold - così un sacco di esso è pre costruito per voi, è possibile controllare qui: http://expressjs.com/

Spero che i punti voi nel giusto direzione.