6

MongoDB と Jade テンプレート言語を使用して NodeJS 0.8.8 で実行されている Expressjs アプリがあり、ページ タイトル、ロゴ画像など、サイト全体のプレゼンテーション オプションの多くをユーザーが構成できるようにしたいと考えています。

これらの構成オプションを mongoDB データベースに保存して、アプリケーションの起動時に読み取り、アプリの実行中に操作し、jade テンプレートに表示できるようにするにはどうすればよいですか?

私の一般的なアプリの設定は次のとおりです。

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」というモデルを作成し、Site.find() を実行する accessDB.js に getSiteConfig という関数を作成して、コレクション内の 1 つのドキュメントのフィールドを取得しました。

したがって、これが問題の核心です。サイト全体で使用できるようにするには、これらのフィールドを Express アプリにどのように挿入すればよいでしょうか? moment.js ツールで使用したのと同じパターンに従う必要がありますか? このような:

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

そうでない場合、これを行う正しい方法は何ですか?

ありがとう!

4

1 に答える 1

23

サイト構成のロードに高速ミドルウェアの使用を検討してください。

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);代わりに使用してください。あなたのエラーを express に渡しますerrorHandler

すでにユーザーを認証し (たとえば、以前のミドルウェアで)、そのデータを に保存しているreq.user場合は、それを使用して db から適切な構成を取得できます。

getSiteConfigただし、Express ミドルウェア内で関数を使用する場合は注意してください。これは、データが受信されるまで、Express がリクエストをさらに処理するのを一時停止するためです。

siteConfigアプリケーションを高速化するために、高速セッションでのキャッシュを検討する必要があります。セッション固有のデータを高速セッションに保存することは、ユーザーがアクセスする方法がないため、絶対に安全です。

次のコードはsiteConfig、express sessionnでのキャッシュの考え方を示しています。

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();
    });
  });
  ...
});
于 2012-09-15T14:05:15.507 に答える