MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

node.js &express – globale Module &Best Practices für die Anwendungsstruktur

Ich habe hier einen anderen Ansatz gewählt. Ich sage nicht, dass es das Beste ist, aber lassen Sie es mich erklären.

  1. Jedes Schema (und Modell) befindet sich in einer eigenen Datei (Modul)
  2. Jede Gruppe von Routen für eine bestimmte REST-Ressource befindet sich in ihrer eigenen Datei (Modul)
  3. Jedes Routenmodul nur require s das Mongoose-Modell, das es braucht (nur 1)
  4. Die Hauptdatei (Einstiegspunkt der Anwendung) ist nur require s alle Routenmodule, um sie zu registrieren.
  5. Die Mongo-Verbindung befindet sich in der Stammdatei und wird als Parameter an alles weitergegeben, was sie benötigt.

Ich habe zwei Unterordner unter meinem App-Root - routes und schemas .

Die Vorteile dieses Ansatzes sind:

  • Sie schreiben das Schema nur einmal.
  • Sie verschmutzen Ihre Hauptanwendungsdatei nicht mit Routenregistrierungen für 4–5 Routen pro REST-Ressource (CRUD)
  • Sie definieren die DB-Verbindung nur einmal

So sieht eine bestimmte Schemadatei aus:

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

So sieht eine Sammlung von Routen für eine bestimmte Ressource aus:

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

Und hier ist die Root-Anwendungsdatei, die die Verbindung initialisiert und alle Routen registriert:

Datei: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);

Ich hoffe, das war hilfreich.