MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

node.js &express - módulos globais e melhores práticas para estrutura de aplicativos


Tomei outra abordagem aqui. Não estou dizendo que é o melhor, mas deixe-me explicar.
  1. Cada esquema (e modelo) está em seu próprio arquivo (módulo)
  2. Cada grupo de rotas para um determinado recurso REST está em seu próprio arquivo (módulo)
  3. Cada módulo de rota apenas require é o modelo Mongoose de que precisa (apenas 1)
  4. O arquivo principal (ponto de entrada do aplicativo) apenas require s todos os módulos de rota para registrá-los.
  5. A conexão do Mongo está no arquivo raiz e é passada como parâmetro para o que precisar.

Eu tenho duas subpastas na raiz do meu aplicativo - routes e schemas .

Os benefícios desta abordagem são:
  • Você escreve o esquema apenas uma vez.
  • Você não polui seu arquivo de aplicativo principal com registros de rota para 4-5 rotas por recurso REST (CRUD)
  • Você só define a conexão de banco de dados uma vez

Aqui está a aparência de um arquivo de esquema específico:

Arquivo:/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 }
    });
}

Aqui está a aparência de uma coleção de rotas para um recurso específico:

Arquivo:/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
        });
      });
    });
};

E aqui está o arquivo da aplicação raiz, que inicializou a conexão e registra todas as rotas:

Arquivo: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 isso tenha sido útil.