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

Arquitetura de aplicativo baseada em Mongoose


Quando entrei no Node.js, Express e Mongoose, tive dificuldades para dimensionar meu código. A intenção da minha resposta é ajudar alguém que está trabalhando em mais do que apenas um blog simples, mas ajudar com um projeto escalável ainda maior.
  • Estou sempre conectado ao banco de dados, não abro e fecho conexões quando necessário
  • Eu uso index.js como o arquivo raiz de uma pasta, assim como faríamos em outros idiomas
  • os modelos são mantidos em seus próprios documentos e require() d no models/index.js arquivo.
  • as rotas são semelhantes aos modelos, cada nível de rota tem uma pasta, que possui um index.js arquivo por sua vez. Portanto, é fácil organizar algo como http://example.com/api/documents/:id . Também faz mais sentido quando se percorre a estrutura do arquivo.

Aqui está a estrutura do que eu uso:
-- app.js
-- models/
---- index.js
---- blog.js
-- mongoose/
---- index.js
-- routes/
---- index.js
---- blog/index.js
-- public/
-- views/
---- index.{your layout engine} => I use Jade.lang
-- methods/
---- index.js => use if you'd rather write all your functions here
---- blog.js => can store more complex logic here

app.js
var db = require('./mongoose'),
  express = require('express');
// note that I'm leaving out the other things like 'http' or 'path'
var app = express();

// get the routes
require('./routes')(app);
// I just require routes, without naming it as a var, & that I pass (app)

mangusto/index.js
// Mongoose connect is called once by the app.js & connection established
// No need to include it elsewhere
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/blog');

// I have just connected, and I'm not exporting anything from here

models/index.js
// Logic here is to keep a good reference of what's used

// models
Blog = require('./blog');
// User = require('./user');

// exports
exports.blogModel = Blog.blogModel;
// exports.userModel = User.userModel;

models/blog.js

Então, para cada modelo em que você trabalha, você cria um model.js documento e adicione-o no models/index.js acima de. Como exemplo, adicionei um User modelo, mas comentou.
// set up mongoose
var mongoose = require('mongoose');
var Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;

var BlogSchema = Schema({
  header: {type: String },
  author: {type: String },
  text: {type: String },
  _id: { type: ObjectId } // not necessary, showing use of ObjectId
});

Blog = mongoose.model('Blog', BlogSchema);
// the above is necessary as you might have embedded schemas which you don't export

exports.blogModel = Blog;

routes/index.js
module.exports = function(app) {
  app.get('/', function(req, res) {
    // do stuff
  });
  require('./blog')(app);
  // other routes entered here as require(route)(app);
  // we basically pass 'app' around to each route
}

routes/blog/index.js
module.exports = function(app) {
  app.get('/blog', function(req, res) {
    // do stuff
  });
  require('./nested')(app);
  // this is for things like http://example.com/blog/nested
  // you would follow the same logic as in 'routes/index.js' at a nested level
}

uso sugerido
  • modelos:para criar a lógica que lida com os documentos, ou seja, criar, atualizar, excluir e pesquisar.
  • rotas:codificação mínima, apenas onde preciso analisar dados http, criar instâncias de modelos e enviar consultas para o modelo relevante.
  • métodos:para a lógica mais complexa que não envolve diretamente modelos. Como exemplo, tenho um algorithms/ pasta onde armazeno todos os algoritmos que uso no meu aplicativo.

Espero que isso forneça mais clareza. Essa estrutura está fazendo maravilhas para mim, pois acho fácil de seguir.