sql >> Base de Datos >  >> NoSQL >> MongoDB

node.js &express:módulos globales y mejores prácticas para la estructura de la aplicación

He adoptado otro enfoque aquí. No digo que sea lo mejor, pero déjame explicarte.

  1. Cada esquema (y modelo) está en su propio archivo (módulo)
  2. Cada grupo de rutas para un recurso REST particular está en su propio archivo (módulo)
  3. Cada módulo de ruta solo require s el modelo Mongoose que necesita (solo 1)
  4. El archivo principal (punto de entrada de la aplicación) solo require s todos los módulos de ruta para registrarlos.
  5. La conexión de Mongo está en el archivo raíz y se pasa como parámetro a lo que sea que lo necesite.

Tengo dos subcarpetas debajo de la raíz de mi aplicación:routes y schemas .

Los beneficios de este enfoque son:

  • Solo escribes el esquema una vez.
  • No contamina el archivo de su aplicación principal con registros de ruta para 4-5 rutas por recurso REST (CRUD)
  • Solo define la conexión DB una vez

Así es como se ve un archivo de esquema en particular:

Archivo:/schemas/theaterSchema.js

module.exports = function(db) {
        return db.model('Theater', TheaterSchema());
}

function TheaterSchema () {
        var Schema = require('mongoose').Schema;

        return new Schema({
            title: { type: String, required: true },
            description: { type: String, required: true },
            address: { type: String, required: true },
            latitude: { type: Number, required: false },
            longitude: { type: Number, required: false },
            phone: { type: String, required: false }
    });
}

Así es como se ve una colección de rutas para un recurso en particular:

Archivo:/routes/theaters.js

module.exports = function (app, options) {

    var mongoose = options.mongoose;
    var Schema = options.mongoose.Schema;
    var db = options.db;

    var TheaterModel = require('../schemas/theaterSchema')(db);

    app.get('/api/theaters', function (req, res) {
            var qSkip = req.query.skip;
            var qTake = req.query.take;
            var qSort = req.query.sort;
            var qFilter = req.query.filter;
            return TheaterModel.find().sort(qSort).skip(qSkip).limit(qTake)
            .exec(function (err, theaters) {
                    // more code
            });
    });

    app.post('/api/theaters', function (req, res) {
      var theater;

      theater.save(function (err) {
        // more code
      });
      return res.send(theater);
    });

    app.get('/api/theaters/:id', function (req, res) {
      return TheaterModel.findById(req.params.id, function (err, theater) {
        // more code
      });
    });

    app.put('/api/theaters/:id', function (req, res) {
      return TheaterModel.findById(req.params.id, function (err, theater) {
        // more code
      });
    });

    app.delete('/api/theaters/:id', function (req, res) {
      return TheaterModel.findById(req.params.id, function (err, theater) {
        return theater.remove(function (err) {
          // more code
        });
      });
    });
};

Y aquí está el archivo de la aplicación raíz, que inicializó la conexión y registra todas las rutas:

Archivo:app.js

var application_root = __dirname,
        express = require('express'),
        path = require('path'),
        mongoose = require('mongoose'),
        http = require('http');

var app = express();

var dbProduction = mongoose.createConnection('mongodb://here_insert_the_mongo_connection_string');

app.configure(function () {
        app.use(express.bodyParser());
        app.use(express.methodOverride());
        app.use(app.router);
        app.use(express.static(path.join(application_root, "public")));
        app.use('/images/tmb', express.static(path.join(application_root, "images/tmb")));
        app.use('/images/plays', express.static(path.join(application_root, "images/plays")));
        app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.get('/api', function (req, res) {
        res.send('API is running');
});

var theatersApi = require('./routes/theaters')(app, { 'mongoose': mongoose, 'db': dbProduction });
// more code

app.listen(4242);

Espero que esto haya sido útil.