node.js - practices - Estructura de la API REST de ExpressJS y Mongoose: ¿mejores prácticas?




web service rest api node js (2)

Estoy creando una API REST con el uso de NodeJS (Mongoose & ExpressJS). Creo que tengo una estructura básica bastante buena en este momento, pero me pregunto cuáles son las mejores prácticas para este tipo de proyecto.

En esta versión básica, todo pasa a través del archivo app.js Cada método HTTP se pasa al recurso solicitado. Esto me permite agregar recursos dinámicamente a la API y todas las solicitudes se transmitirán en consecuencia. Para ilustrar:

// app.js

var express = require('express');
var mongoose = require('mongoose');

var app = express();
app.use(express.bodyParser());

mongoose.connect('mongodb://localhost/kittens');
var db = mongoose.connection;

var resources = [
  'kitten'
];

var repositories = {};

for (var i = 0; i < resources.length; i++) {
  var resource = resources[i];
  repositories[resource] = require('./api/' + resource);
}

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback() {
  console.log('Successfully connected to MongoDB.');

  app.get('/:resource', function (req, res) {
    res.type('application/json');
    repositories[req.params.resource].findAll(res);
  });

  app.get('/:resource/:id', function (req, res) {
    res.type('application/json');
    repositories[req.params.resource].findOne(req, res);
  });

  app.listen(process.env.PORT || 4730);
});

-

// api/kitten.js

var mongoose = require('mongoose');

var kittenSchema = mongoose.Schema({
  name: String
});

var Kitten = mongoose.model('Kitten', kittenSchema);

exports.findAll = function (res) {
  Kitten.find(function (err, kittens) {
    if (err) {
    }
    res.json(kittens);
  });
};

exports.findOne = function (req, res) {
  Kitten.findOne({ _id: req.params.id}, function (err, kitten) {
    if (err) {
    }
    res.json(kitten);
  });
};

Obviamente, hasta ahora solo se han implementado un par de métodos. ¿Qué piensan ustedes de este enfoque? ¿Algo en lo que pudiera mejorar?

También, una pequeña pregunta api\kitten.js : tengo que requerir la mangosta en cada archivo de recursos de API (como en api\kitten.js , ¿hay alguna forma de requerirlo globalmente en el archivo app.js o algo así?

¡Cualquier aporte es muy apreciado!


Bueno, puede separar sus rutas, modelos de db y plantillas en diferentes archivos. Tener una estructura de directorio algo como esto,

| your_app
| -- routes
| -- models
| -- templates
| -- static
    | -- css
    | -- js
    | -- images
| -- config.js
| -- app.js
| -- url.js
  • Para cada modelo de Mongoose, coloque un archivo separado en su ./models
  • En el directorio de plantillas coloca tus archivos de jade. (Suponiendo que está utilizando jade como su motor de plantillas). Aunque parece que solo estás sirviendo a JSON, no a HTML. Considera usar Jade si quieres renderizar HTML. (Aquí hay algunos otros motores de plantillas que puedes considerar ir con)
  • Directorio ./static para archivos estáticos JS, CSS y XML, etc.
  • Cosas como conexiones de db o claves de API de terceros y cosas se pueden poner en config.js
  • En url.js tenemos un procedimiento que toma el objeto expreso de la app como argumento y se extiende sobre app.get y app.post allí en un solo lugar.

PD: Este es el enfoque que utilizo para una aplicación web básica en Express. De ninguna manera lo digo como la mejor manera de seguirlo, pero me ayuda a mantener mi código.


Como dijo codemonger5, no existe una forma correcta de organizar la estructura de directorios.

Sin embargo, puede usar this aplicación para crear API REST con Express y mongoose con ES6. Usamos la misma estructura de directorios en nuestros servicios de API de producción.

git clone https://github.com/KunalKapadia/express-mongoose-es6-rest-api
cd express-mongoose-es6-rest-api
npm install
npm start




mongoose