2012-09-14 15 views
5

MongoDBとJadeテンプレート言語を使用してNodeJS 0.8.8で実行されるExpressjsアプリケーションがあります。ページタイトル、ロゴイメージなどのサイト全体のプレゼンテーションオプションの多くをユーザーが設定できるようにしたいと思いますNodeJS ExpressアプリケーションのMongoDBにサイト設定を保存するにはどうしたらいいですか?

これらの設定オプションを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.findを実行accessDB.jsでgetSiteConfigと呼ばれる機能を持っています()...コレクション内の1つのドキュメントのフィールドを取得します。

これは質問の要点です:これらのフィールドをエクスプレスアプリに注入して、サイト全体でどのように使用できるのですか?私はmoment.jsツールで使用したのと同じパターンを実行する必要がありますか?このように:

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

これを行う正しい方法はありますか?

ありがとうございます!

+0

は、これはあなたがセッションに保存したいものですか? – c0deNinja

+0

いいえ、私はそう信じていません。私はクライアントにアクセス権を与えたくありません。私はちょうどサーバー側のエクスプレスアプリ(特に翡翠)がアクセスできるようにしたい。 私はconsole.logのポイントまで作業しています。私はそれをapp.localsに追加して何が起こるかを見てみるべきだと思うが、それを使うことのセキュリティの意味は不明だ。 (またはその安定性) – tutley

答えて

16

サイト設定を読み込むためにエクスプレスミドルウェアを使用することを検討してください。

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機能を使用することに注意してください。これは、データの受信までリクエストの処理を中断するためです。

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

次のコードは、エクスプレス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(); 
    }); 
    }); 
    ... 
}); 
+1

これは素晴らしい答えです。本当にありがとうございます。残念ながら、私は十分な評判がないので投票できませんが、誰かがこれを見ているなら、これを投票してください。再度、感謝します。 – tutley

関連する問題