sql >> Databáze >  >> NoSQL >> MongoDB

Architektura aplikace založená na Mongoose

Když jsem se poprvé dostal k Node.js, Express a Mongoose, měl jsem problémy se škálováním svého kódu. Záměrem mé odpovědi je pomoci někomu, kdo pracuje na více než jednoduchém blogu, ale pomoci s ještě větším škálovatelným projektem.

  • Jsem vždy připojen k databázi, neotevírám a nezavírám připojení, když je potřeba
  • Používám index.js jako kořenový soubor složky, stejně jako bychom to dělali v jiných jazycích
  • modely jsou uchovávány v jejich vlastních dokumentech a require() d do models/index.js soubor.
  • trasy jsou podobné modelům, každá úroveň trasy má složku, která má index.js soubor v pořadí. Je tedy snadné zařídit něco jako http://example.com/api/documents/:id . Dává to také větší smysl, když člověk prochází strukturou souborů.

Zde je struktura toho, co používám:

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

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

Takže pro každý model, na kterém pracujete, vytvořte model.js dokumentu a přidejte jej do models/index.js výše. Jako příklad jsem přidal User model, ale okomentoval to.

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

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

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

doporučené použití

  • modely:pro vytváření logiky, která se zabývá dokumenty, tj. vytváření, aktualizace, mazání a vyhledávání.
  • trasy:minimální kódování, pouze tam, kde potřebuji analyzovat http data, vytvářet instance modelů a poté odesílám dotazy na příslušný model.
  • metody:pro složitější logiku, která přímo nezahrnuje modely. Jako příklad mám algorithms/ složka, do které ukládám všechny algoritmy, které ve své aplikaci používám.

Doufám, že to poskytne větší jasnost. Tato struktura se mnou dělá zázraky, protože je snadné ji sledovat.



  1. pomocí Async uvnitř transakce v aplikaci Spring

  2. Laravel :Redis Nebylo možné navázat spojení :[tcp://127.0.0.1:6379]

  3. Vytáhněte záznam z pole přes Meteor

  4. Jak v Mongoose seřadím podle data? (node.js)