sql >> Base de Datos >  >> NoSQL >> MongoDB

Quiere obtener claridad sobre la estructura de la aplicación NodeJS (pila completa de JavaScript)

Muy bien, esta es una pregunta bastante amplia y definitivamente no soy un experto, pero haré lo mejor que pueda aquí.

TL;RD

  • routes son controladores que indican qué lógica ejecutar cuando un usuario navega con su navegador a una determinada ruta dentro de su aplicación, incluidas qué vistas mostrar y qué datos enviar a esas vistas
  • models son solo eso:modelos de datos dentro de su aplicación
  • module.exports = le dice a un archivo qué es exactamente lo que "exporta", es decir, qué código debe ejecutarse o accederse desde el archivo principal de la aplicación.
  • require(..) incluye un modulo. Puede configurar esto en una variable para que pueda llamar a las funciones del módulo más tarde, o simplemente ejecutar una función si eso es todo lo que module.exports devoluciones.

La combinación de estas técnicas puede ayudarlo a definir un marco sólido para cualquiera de sus aplicaciones.

Respuesta larga

Express proporciona un marco sólido para estructurar su aplicación Node.js. Node es completamente independiente de Express, pero debido a lo popular que es Express, prácticamente van de la mano. Una vez instalado, Express se puede usar para generar un proyecto web de andamio (con opciones) para que lo construyas si lo deseas.

Controladores

Un proyecto generado creará /routes/index.js , que (si entiende MVC) es esencialmente su principal controlador . Una ruta en express se escribe así:

app.get('/path', function(req, res, next){ .. } );

Analicemos eso:a nuestra variable de aplicación (aplicación) se le dice que en una solicitud GET a '/path' para ejecutar una función de devolución de llamada anónima con req, res, next variables (solicitud, respuesta, devolución de llamada respectivamente). Encuentro útil pensar en esto como un controlador de eventos personalizado.

Es importante tener en cuenta en este punto que también podríamos llamar a app.post con la misma sintaxis para publicaciones en una URL que para get.

Dentro de nuestra devolución de llamada anónima, manejamos cualquier dato entrante y mostramos una vista para el usuario. Aquí es donde termina la mayor parte de mi lógica comercial, por lo que en realidad tiene sentido NO usar funciones anónimas aquí. Este es un ejemplo de una devolución de llamada básica que solo muestra una página de inicio:

app.get('/', function(req, res, next){

    //some business logic

    res.render('views/home');
});

Cuando el usuario intenta OBTENER la ruta del índice de nuestra aplicación (/ ), simplemente renderizamos nuestro home view que, desde la raíz de nuestro proyecto, se almacena en una views carpeta.

Pero, ¿qué sucede si queremos modularizar esto para no declarar todas nuestras rutas en nuestro app.js principal? o server.js ?

Usamos module.exports = .. en nuestros módulos para decirle a nuestro servidor qué incluir exactamente. En mi controlador, exporto una sola función que toma la aplicación como argumento y la usa para definir nuestras rutas así:

Controladores/Usuario.js

 module.exports = function(app){

    app.get('/users', function(req, res){
        var users = req.db.collection('users').find();
        if (!users) {
            console.log("no users found");
            res.redirect('/');
        } else {
            res.render('users/index', {users : users});
        }
    });

};

No te preocupes por el req.db código, adjunto la base de datos a la solicitud en mi aplicación, pero eso no se hace de forma predeterminada. Simplemente comprenda que obtengo una lista de 'usuarios' aquí y redirijo al usuario al índice de mi aplicación si no hay ninguno.

Modelos

Mongoose nos proporciona una gran interfaz para escribir modelos. Con mangosta, escribir modelos es un proceso de tres pasos:

  • Definir un esquema
  • Definir la lógica del modelo
  • Generar y exportar el modelo

Aquí hay un ejemplo de un User modelo:

Modelos/Usuario.js

var mongoose = require('mongoose'),
    userSchema = new mongoose.Schema({

        name: { type: String, required: true },
        joinDate: {type: Date, default: date.now }

    }),
    User = mongoose.model('user', userSchema);

module.exports = user;

Aplicación de servidor

module.exports se utiliza para ayudarnos a definir algo de modularidad en nuestro código base. Cuando ejecutamos una aplicación de nodo, en última instancia, ejecutamos un solo archivo JavaScript (ya ha visto ese archivo con server.js o app.js ).

Para evitar que este archivo crezca demasiado con múltiples modelos y rutas, usamos require(module) para incluir código de otros archivos JS. module en nuestro caso sería una ruta al módulo que queremos requerir. Si tiene la siguiente estructura de documentos:

| Controllers
    - User.js
| Models
    - User.js
| Views
app.js

Para incluir su controlador de usuario desde app.js , escribiría:require('./Controllers/User') . Dado que nuestros módulos de controlador simplemente exportan funciones, podemos llamar a esa función inmediatamente después de nuestra instrucción require simplemente agregando paréntesis al final (con los parámetros que se requieran). Incluir mis controladores se ve así:

require('./Controllers/User')(app)

Paso la aplicación real, porque mi módulo (abajo) simplemente exporta una función que agrega lógica comercial a las rutas de mi aplicación. Esto solo debe llamarse y nunca usarse, por lo que no capturo mi controlador como una variable para llamar a métodos más tarde.

Incluir modelos es un poco diferente, ya que es posible que queramos realizar alguna operación que define nuestro modelo. Podemos hacer esto cambiando un poco nuestro código requerido:

var User = require('./Models/User');

Ahora podemos llamar a los métodos de nuestro modelo de usuario en cualquier momento. Mongoose nos brinda una gran cantidad de funciones básicas de forma gratuita:

User.find({}, function(err, users){ .. });

La función anterior buscará a todos nuestros usuarios y luego ejecutará una función anónima con un potencial err (es nulo si no hay problemas) y luego una lista de nuestros usuarios en formato JSON. Bastante ingenioso.

La combinación de todos estos conceptos es la forma de crear una aplicación web básica con Express y Node.js. Hágame saber en los comentarios si hay algo que pueda aclarar sobre cómo uso Express. Este es un conocimiento muy superficial, y sugiero profundizar en la documentación y buscar complementos para ampliar las capacidades de sus aplicaciones. ¡Buena suerte!