2012-04-23 56 views
3

我正在學習使用Express。我想做的事:如何在Express中添加'查看選項'?

app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.set('view options', { layout: false }); /* asterisk */ 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router);       /* dagger */ 
    app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
    app.use(express.logger('dev')); 
    app.set('view options', { pretty: true });  /* asterisk */ 
}); 

我所做的補充是:

  • 使用 '佈局:假' 的翡翠。
  • 漂亮 - 在Jade中打印HTML。
  • 打開記錄儀,用「開發」格式

有兩個問題:

  1. /* asterisk */當我設置「漂亮:真正的」我重寫我以前的選擇,而不是添加到他們。也就是說,除非我添加{ pretty: true, layout: false },否則我的程序會中斷,這會讓您覺得冗餘並且不能正確。我如何糾正它,以便我只是「修改」視圖選項,而不是「定義」它們?

  2. /* dagger */該記錄器不會確認我的請求,但/favicon.ico除外。我發現如果我刪除app.use(app.router);行,那麼我會看到//favicon.ico。這裏發生了什麼?

回答

2

我在快遞源代碼進行覈對和app.set功能簡單地分配在以前的任何值它有頂部。要獲得您要查找的行爲,您必須在後續調用中合併view options對象。這意味着你可能不得不跳過幾圈。該連接封裝具有合併功能,將這一工作,但得到它,你就必須把它列入你的package.json

"dependencies": { 
    "express": "2.5.5" 
, "jade": ">= 0.0.1" 
, "connect": "1.X" 
} 

你需要從連接utils對象:

var utils = require('connect').utils; 

app.set(option)沒有值返回該選項的當前設置,以便你第二次設置view option你可以這樣來做:

app.set('view options', utils.merge(app.set('view options'), { pretty: true })); 

至於你使用記錄器時遇到的問題,請記住app.use正在將一些中間件添加到堆棧中。在處理請求時,它會按照它們最初配置的順序調用每個中間件,有時如果一箇中間件能夠履行其職責,它將不會將控制權交給堆棧中的後續中間件。

這是router中間件滿足請求'/' url的情況,其中logger未隨後運行。 favicon.ico的請求顯示在日誌流中的原因是,沒有一箇中間件能夠滿足它(如果您有public/favicon.ico文件,則中間件將會爲static),並且處理直至logger中間件。

爲了使您的示例工作,您需要先定義logger中間件,然後在router中間件之前定義堆棧中的中間件。

+0

謝謝,我明白你的意思有關中間件堆棧什麼自定義的分隔符。重新排序解決了這個問題,這使得我的app.js看起來很尷尬:在我只有一個'app.configure('development'')之前,現在我必須有兩到三個遍歷,才能獲得訂購權... – 2012-04-23 20:12:06