¿Cómo estructurar una aplicación de nodo, expreso, conexión de autos y redonda en el lado del servidor?

StackOverflow https://stackoverflow.com/questions/7814794

Pregunta

Soy un tipo del lado del cliente que acaba de entrar en el mundo de JavaScript del lado del servidor. Tengo esta idea sobre cómo creo que quiero construir mi primera aplicación NodeJS. Quiero un lado del servidor que solo sirva un caparazón vacío y mucho JSON. Quiero poner el resto de la lógica en una columna vertebral.

Así que rápidamente preparé una pequeña aplicación (código en la parte inferior) y tengo algunas preguntas.

  1. ¿Son seguras las variables de sesión? ¿Puedo usar las variables de sesión para almacenar un identificador de usuario que luego leí para obtener una fecha confidencial? ¿Es posible modificar las variables de sesiones para que, en mi caso, un usuario pueda obtener los datos de otro usuario?

  2. ¿Tiene sentido servir a JSON en la forma en que lo hago en mi ruta '/perfil'? En mi aplicación habrá muchas rutas como esa. Rutas que obtienen algo de la base de datos y las sirve como JSON al cliente.

  3. Mirando mi código, ¿tienes algún consejo o truco? Cosas que debería hacer de manera diferente. Módulos probablemente debería echar un vistazo?

  4. ¿Mi idea de un backend casi solo JSON tiene sentido?

Mi aplicación a continuación.

var facebook = {
    'appId'         : "my app id",
    'appSecret'     : "my app secret",
    'scope'         : "email",
    'callback'      : "http://localhost:2000/"
}

var express         = require('express');
var MongoStore      = require('connect-mongo');
var auth            = require('connect-auth')
var UserProvider    = require('./providers/user').UserProvider;
var app             = module.exports = express.createServer();

// Configuration
app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser());
    app.use(auth([auth.Facebook(facebook)]));
    app.use(express.session({secret: 'my secret',store: new MongoStore({db: 'app'})}));
    app.use(express.compiler({ src: __dirname + '/public', enable: ['less'] }));
    app.use(app.router);
    app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function(){
    app.use(express.errorHandler()); 
});


// Providers
var UserProvider = new UserProvider('localhost', 27017);

// Routes
app.get('/', function( request, response ) {

    if( !request.session.userId ) {
        request.authenticate(['facebook'], function(error, authenticated) {
            if( authenticated ) {
                request.session.userId = request.getAuthDetails().user.id;
            }
        });
    }

    response.render( 'index.jade' );

});

app.get('/profile', function( request, response ) {

    response.contentType('application/json');
    if( request.session.userId ){
        UserProvider.findById( request.session.userId, function( error, user ){
            var userJSON = JSON.stringify( user );
            response.send( userJSON );
        });
    } else {
        response.writeHead(303, { 'Location': "/" });
    }

});

app.get('/logout', function( request, response, params ) {

    request.session.destroy();
    request.logout();
    response.writeHead(303, { 'Location': "/" });
    response.end('');

});

app.listen(2000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
¿Fue útil?

Solución

Creo que tienes la idea correcta, aunque tiraré un par de pensamientos:

  • Definición de rutas - Si está definiendo muchas rutas, especialmente con JSON, es posible que desee definirlas dinámicamente a través de un marco de tipo MVC. Puedes encontrar un buen ejemplo de eso En las muestras expresas aquí. Le ahorraría muchas rutas escritas a mano y podría pasar los objetos de nodo al cliente como JSON sin hacer mucho más en el lado del servidor.
  • Columna vertebral en el servidor - Si quieres volver un poco más loco (y nunca he usado esta técnica), Semilla de desarrollo han construido un marco llamado huesos que Utiliza la columna vertebral en el lado del servidor.
  • Ejemplo de inicio de sesión - Hay Un buen tutorial en DailyJS Con respecto a la gestión de la sesión del usuario.
  • Accesibilidad - Mientras no tenga problemas de accesibilidad, proporcionar datos a través de una API REST tiene sentido. Si tiene que preocuparse por el cumplimiento de 508 u otras limitaciones de JavaScript, podría tener problemas.

En cuanto a la seguridad, establecer el tiempo de espera de su sesión en un valor más bajo y elegir una clave secreta apropiada probablemente contribuiría en gran medida a asegurarse de que alguien no pueda generar cookies de sesión (de forma predeterminada, los datos reales no se almacenan en el cliente). No estoy seguro de qué usa el algoritmo Node.js para generar cookies de sesión. Aquí hay algunos detalles sobre el middleware de sesión expresa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top