如何在 MongoDB 中为 NodeJS Express 应用程序存储站点配置?

Posted

技术标签:

【中文标题】如何在 MongoDB 中为 NodeJS Express 应用程序存储站点配置?【英文标题】:How can I store site configuration in MongoDB for a NodeJS Express App? 【发布时间】:2012-09-07 22:46:34 【问题描述】:

我有一个使用 MongoDB 和 Jade 模板语言在 NodeJS 0.8.8 上运行的 Expressjs 应用程序,我希望允许用户配置许多站点范围的演示选项,例如页面标题、徽标图像、等等

如何将这些配置选项存储在 mongoDB 数据库中,以便在应用程序启动时读取它们,在应用程序运行时对其进行操作,并将它们显示在玉模板中?

这是我的一般应用设置:

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);

到目前为止,我已经为“siteConfig”集合创建了一个名为“Site”的模型,并且我在 accessDB.js 中有一个名为 getSiteConfig 的函数,它运行 Site.find()... 以检索一个文档中的字段集合。

所以这是问题的症结所在:我应该如何将这些字段注入到 express 应用程序中,以便它们可以在整个站点中使用?我应该遵循与 moment.js 工具相同的模式吗?像这样:

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

如果不是,那么正确的做法是什么?

谢谢!

【问题讨论】:

这是您要存储在会话中的内容吗? 不,我不这么认为。我不希望客户可以访问它。我只希望服务器端快速应用程序(尤其是 Jade)能够访问它。我让它工作到了console.log。我想我应该尝试将它添加到 app.locals 并看看会发生什么,但我不确定使用它的安全隐患。 (或它的稳定性) 【参考方案1】:

考虑使用快速中间件来加载站点配置。

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();
    );
  );
  ...
);

抛出错误是一个非常糟糕的主意,因为它会使您的应用程序崩溃。 所以请改用next(err);。它会将您的错误传递给表达errorHandler

如果您已经验证了您的用户(例如在以前的中间件中)并将其数据存储到 req.user,您可以使用它从 db 获取正确的配置。

但是在 express 中间件中使用 getSiteConfig 函数时要小心,因为它会暂停 express 对请求的进一步处理,直到接收到数据。

您应该考虑在快速会话中缓存siteConfig 以加速您的应用程序。在快速会话中存储特定于会话的数据是绝对安全的,因为用户无法访问它。

以下代码演示了在 express sessionn 中缓存siteConfig 的想法:

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();
    );
  );
  ...
);

【讨论】:

这是一个很好的答案,我真的很感激。不幸的是我不能投票,因为我没有足够的声誉,但如果有人在看这个,请投票。再次感谢。

以上是关于如何在 MongoDB 中为 NodeJS Express 应用程序存储站点配置?的主要内容,如果未能解决你的问题,请参考以下文章

在 mongodb-native NodeJS 中为每个子进程使用集群的单个连接池与多个连接池

如何使用 multer 模块将图像上传到 mongodb

如何在cloudformation中为我的beantalk定义nodejs的版本

如何在 mongodb 中为新日期创建新对象?

单链查询 mongodb / mongoose 获取所有评论

如何在 Mongoid / MongoDB 中为 $within 查询选择单位