Saltar al contenido

Estructura de archivos del proyecto Mongoose & NodeJS

Esta sección ha sido aprobado por especialistas para que tengas la seguridad de la veracidad de nuestra esta crónica.

Solución:

aquí hay una muestra 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

Para cargar esto desde un controlador de elementos en app/controllers/items.js yo lo haría

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

En otras palabras, defina tanto el esquema como el modelo en su módulo de modelo y luego exporte solo el modelo. Cargue los módulos de su modelo en los módulos de su controlador utilizando rutas requeridas relativas.

Para hacer la conexión, maneje eso temprano en el código de inicio de su servidor (server.js o lo que sea). Por lo general, querrá leer los parámetros de conexión desde un archivo de configuración o desde variables de entorno y, de forma predeterminada, el modo de desarrollo localhost si no se proporciona ninguna configuración.

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

Un par de respuestas aquí realmente me ayudaron a desarrollar un enfoque alternativo. La pregunta original es sobre romper sólo la definición de esquema, pero prefiero agrupar las definiciones de esquema y modelo en el mismo archivo.

Esta es principalmente la idea de Peter, solo exportar la definición del modelo anulando module.exports para que el acceso al modelo desde su controlador sea un poco menos detallado:

Diseño del proyecto:

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

models/Item.js se vería así:

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

Y accede al modelo en un controlador, digamos user.js, como:

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

...

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

¡No olvide llamar a mongoose.connect(..) en server.js, o en cualquier otro lugar que considere apropiado!

Recientemente respondí una pregunta de Quora con respecto a este mismo problema. http://qr.ae/RoCld1

Lo que me ha parecido muy bonito y ahorra en la cantidad de exigir llamadas es estructurar sus modelos en un solo directorio. Asegúrate de tener un solo modelo por archivo.

Cree un archivo index.js en el mismo directorio que sus modelos. Añádele este código. Asegúrese de agregar lo necesario fs exigir

var fs = require('fs');

/*
 * initializes all models and sources them as .model-name
 */
fs.readdirSync(__dirname).forEach(function(file) 
  if (file !== 'index.js') 
    var moduleName = file.split('.')[0];
    exports[moduleName] = require('./' + moduleName);
  
);

Ahora puede llamar a todos sus modelos de la siguiente manera:

var models = require('./path/to/models');
var User = models.user;
var OtherModel = models['other-model'];

Valoraciones y comentarios

Si para ti ha resultado útil nuestro artículo, agradeceríamos que lo compartas con el resto juniors y nos ayudes a difundir nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *