64 votes

Structure de fichier du projet Mongoose & NodeJS

J'ai actuellement tous mes modèles de Schéma (définitions) dans le /models/models.js fichier pour mon Mangouste/NodeJS application.

Je voudrais briser ces à l'écart, dans des fichiers différents tels que: user_account.js, profile.js, etc. Cependant, je n'arrive pas à le faire alors que mon contrôleurs de pause et de faire rapport "impossible de trouver le module" une fois que je tire de ces classes, à l'exception.

Mon projet est le suivant:

/MyProject
  /controllers
    user.js
    foo.js
    bar.js
    // ... etc, etc
  /models
    models.js
  server.js

Le contenu de mon models.js fichier ressemble à ceci:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;

mongoose.connect('mongodb://localhost/mydb');

var UserAccount = new Schema({
    user_name       : { type: String, required: true, lowercase: true, trim: true, index: { unique: true } }, 
    password        : { type: String, required: true },
    date_created    : { type: Date, required: true, default: Date.now }
}); 

var Product = new Schema({
    upc             : { type: String, required: true, index: { unique: true } },
    description     : { type: String, trim: true },
    size_weight     : { type: String, trim: true }
});

Mon user.js fichier (contrôleur) ressemble à ceci:

var mongoose    = require('mongoose'), 
    UserAccount = mongoose.model('user_account', UserAccount);

exports.create = function(req, res, next) {

    var username = req.body.username; 
    var password = req.body.password;

    // Do epic sh...what?! :)
}

Comment puis-je briser la définition de schéma dans plusieurs fichiers et également de référence à partir de mon contrôleur? Quand je fais référence (après le schéma est dans un nouveau fichier), j'obtiens cette erreur:

*Erreur: Schéma n'a pas été enregistré pour le modèle "user_account".*

Pensées?

102voto

Peter Lyons Points 47794

Voici un exemple d' app/models/item.js

var mongoose = require("mongoose");

var ItemSchema = new mongoose.Schema({
  name: {
    type: String,
    index: true
  },
  equipped: Boolean,
  owner_id: {
    type: mongoose.Schema.Types.ObjectId,
    index: true
  },
  room_id: {
    type: mongoose.Schema.Types.ObjectId,
    index: true
  }
});

var Item = mongoose.model('Item', ItemSchema);

module.exports = {
  Item: Item
}

De le charger à partir d'un élément contrôleur en app/controllers/items.js , je le ferais

  var Item = require("../models/item").Item;
  //Now you can do Item.find, Item.update, etc

En d'autres termes, de définir à la fois le schéma et le modèle de votre modèle de module, puis exporter simplement le modèle. Chargez votre modèle des modules dans votre contrôleur de modules d'aide par rapport exiger des chemins.

Pour faire le lien, de le manipuler dès le début de votre serveur de code de démarrage (server.js ou quoi que ce soit). Habituellement, vous aurez envie de lire les paramètres de connexion à partir d'un fichier de configuration ou de variables d'environnement et par défaut en mode développement localhost si aucune configuration n'est fourni.

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost');

37voto

Nick Boyle Points 131

Quelques réponses ici m'a vraiment aidé à développer une approche alternative. La question d'origine est en ce qui concerne la rupture juste la définition de Schéma, mais je préfère intégrer le Schéma et définitions de Modèle dans le même fichier.

C'est surtout Pierre idée, que l'exportation de la définition du modèle en remplaçant le module.les exportations de faire accéder le modèle de votre contrôleur un peu moins verbeux:

Présentation de projet:

MyProject
  /controllers
    user.js
    foo.js
    bar.js
    // ... etc, etc
  /models
    Item.js
  server.js

models/Item.js ressemblerait à:

var mongoose = require("mongoose");

var ItemSchema = new mongoose.Schema({
  name: {
    type: String,
    index: true
  }
});

module.exports = mongoose.model('Item', ItemSchema); 
// Now `require('Item.js')` will return a mongoose Model,
// without needing to do require('Item.js').Item

Et vous accéder au modèle dans un contrôleur, dire user.js comme par exemple:

var Item = require(__dirname+'/../models/Item')

...

var item = new Item({name:'Foobar'});

N'oubliez pas d'appeler la mangouste.connect(..) dans server.js, ou partout ailleurs où bon vous semblera!

9voto

user1460015 Points 343

Peter Lyons a à peu près couvert la base.
Empruntant à l'exemple ci-dessus (suppression des lignes après le schéma), je voulais juste ajouter:

app/models/item.js

 note: notice where `module.exports` is placed
var mongoose = require("mongoose");

var ItemSchema = module.exports = new mongoose.Schema({
  name: {
    type: String,
    index: true
  },
  ...

});
 

Pour le charger depuis les app/controllers/items.js

 var mongoose = require('mongoose');
var Item = mongoose.model('Item', require('../models/item'));  
 

Une autre manière sans module.exports ou require :

app/models/item.js

 var mongoose = require("mongoose");

var ItemSchema = new mongoose.Schema({
  name: {
    type: String,
    index: true
  },
  ... 

});

mongoose.model('Item', ItemSchema); // register model
 

Dans les app/controllers/items.js

 var mongoose = require('mongoose')
  , Item = mongoose.model('Item');  // registered model
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X