MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Architecture d'application basée sur Mongoose

Lorsque je suis entré dans Node.js, Express et Mongoose, j'ai eu du mal à faire évoluer mon code. L'intention de ma réponse est d'aider quelqu'un qui travaille sur plus qu'un simple blog, mais d'aider à un projet évolutif encore plus vaste.

  • Je suis toujours connecté à la base de données, je n'ouvre et ne ferme pas les connexions en cas de besoin
  • J'utilise index.js comme fichier racine d'un dossier, comme nous le ferions dans d'autres langues
  • les modèles sont conservés dans leurs propres documents, et require() d dans models/index.js fichier.
  • les routes sont similaires aux modèles, chaque niveau de route a un dossier, qui a un index.js déposer à son tour. Il est donc facile d'organiser quelque chose comme http://example.com/api/documents/:id . Cela a également plus de sens lorsque l'on parcourt la structure du fichier.

Voici la structure de ce que j'utilise :

-- 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)

mongoose/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

modèles/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;

modèles/blog.js

Ainsi, pour chaque modèle sur lequel vous travaillez, vous créez un model.js document, et ajoutez-le dans le models/index.js au dessus de. Par exemple, j'ai ajouté un User modèle mais l'a commenté.

// 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
}

utilisation suggérée

  • modèles :pour créer la logique qui traite les documents, c'est-à-dire créer, mettre à jour, supprimer et rechercher.
  • routes :codage minimal, uniquement lorsque j'ai besoin d'analyser des données http, de créer des instances de modèles, puis d'envoyer des requêtes au modèle concerné.
  • méthodes :pour la logique plus complexe qui n'implique pas directement des modèles. Par exemple, j'ai un algorithms/ dossier où je stocke tous les algorithmes que j'utilise dans mon application.

J'espère que cela apportera plus de clarté. Cette structure fonctionne à merveille pour moi car je la trouve facile à suivre.