Pregunta ¿Cómo puedo almacenar la configuración del sitio en MongoDB para una aplicación NodeJS Express?


Tengo una aplicación Expressjs que se ejecuta en NodeJS 0.8.8 con MongoDB y el lenguaje de plantilla de Jade, y me gustaría permitir que el usuario configure muchas de las opciones de presentación en todo el sitio, como los títulos de las páginas, la imagen del logotipo, etc.

¿Cómo puedo almacenar estas opciones de configuración en una base de datos mongoDB para poder leerlas en el inicio de la aplicación, manipularlas mientras se ejecuta la aplicación y mostrarlas en las plantillas de jade?

Aquí está mi configuración general de la aplicación:

var app = module.exports = express();
global.app = app;
var DB = require('./accessDB');
var conn = 'mongodb://localhost/dbname';
var db;

// App Config
app.configure(function(){
   ...
});

db = new DB.startup(conn);

//env specific config
app.configure('development', function(){
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
}); // etc

// use date manipulation tool moment
app.locals.moment = moment;

// Load the router
require('./routes')(app);

Hasta ahora he creado un modelo llamado "Sitio" para la colección "SiteConfig" y tengo una función llamada getSiteConfig en accessDB.js que ejecuta Site.find () ... para recuperar los campos en el documento de la colección.

Este es el quid de la pregunta: ¿cómo debo inyectar esos campos en la aplicación Express para que puedan usarse en todo el sitio? ¿Debería seguir el mismo patrón que utilicé con la herramienta moment.js? Me gusta esto:

db.getSiteConfig(function(err, siteConfig){
  if (err) {throw err;}
  app.locals.siteConfig = siteConfig;
});

Si no, ¿cuál sería la forma correcta de hacer esto?

¡Gracias!


5
2017-09-14 18:35


origen


Respuestas:


Considere el uso de middleware expreso para cargar la configuración del sitio.

app.configure(function() {
  app.use(function(req, res, next) {
    // feel free to use req to store any user-specific data
    return db.getSiteConfig(req.user, function(err, siteConfig) {
      if (err) return next(err);
      res.local('siteConfig', siteConfig);
      return next();
    });
  });
  ...
});

Lanzar una equivocación es una muy mala idea porque bloqueará su aplicación. Entonces usa next(err); en lugar. Pasará su error para expresar errorHandler.

Si ya autentificó a su usuario (en middleware anterior, por ejemplo) y almacenó sus datos en req.user, puedes usarlo para obtener la configuración correcta de db.

Pero ten cuidado al usar tu getSiteConfig funciona dentro de middleware expreso porque hará una pausa en el procesamiento posterior de la solicitud hasta que se reciban los datos.

Usted debe considerar el almacenamiento en caché siteConfig en sesión express para acelerar tu aplicación. El almacenamiento de datos específicos de la sesión en sesión rápida es absolutamente seguro porque no hay forma de que el usuario tenga acceso a ellos.

El siguiente código demuestra la idea de almacenar en caché siteConfig en sesión expresa:

app.configure(function() {
  app.use(express.session({
    secret: "your sercret"
  }));
  app.use(/* Some middleware that handles authentication */);
  app.use(function(req, res, next) {
    if (req.session.siteConfig) {
      res.local('siteConfig', req.session.siteConfig);
      return next();
    }
    return db.getSiteConfig(req.user, function(err, siteConfig) {
      if (err) return next(err);
      req.session.siteConfig = siteConfig;
      res.local('siteConfig', siteConfig);
      return next();
    });
  });
  ...
});

17
2017-09-15 14:05