2016-03-09 604 views
2

我使用配置管理Confidence庫(在HapiJS套件)在我的項目(這個配置文件是專門爲WinstonJS運輸),如果我想知道可以爲過濾對象中的單個項目設置默認值。我不知道我解釋這個權利,我還不能肯定正確的術語是什麼,所以下面有一個例子:設置默認值

我有我的配置設置的部分,像這樣目前:

module.exports = { 
    $filter: 'env', 
    development: { 
     level: { 
      console: 'debug', 
      file: 'debug' 
     }, 
     path: 'app-core.log' 
    }, 
    staging: { 
     level: { 
      console: 'warn', 
      file: 'warn' 
     }, 
     path: 'app-core.log' 
    }, 
    production: { 
     level: { 
      console: 'error', 
      file: 'error' 
     }, 
     path: 'prod-app-core.log' 
    } 
} 

但由於項目的path應該是相同的,但production除外,我希望我可以爲path值設置默認值。這樣的事情:

module.exports = { 
    $filter: 'env', 
    development: { 
     level: { 
      console: 'debug', 
      file: 'debug' 
     } 
    }, 
    staging: { 
     level: { 
      console: 'warn', 
      file: 'warn' 
     } 
    }, 
    production: { 
     level: { 
      console: 'error', 
      file: 'error' 
     }, 
     path: 'prod-app-core.log' 
    }, 
    $default: { 
     path: 'app-core.log' 
    } 
} 

顯然,這並不奏效,但我希望它能說明我正在努力完成什麼。我無法找到爲對象內的單個配置項設置默認值的方法,如果我應用過濾器(如staging),那麼它將佔用整個臨時對象,甚至不會查看$default對象。

謝謝!

P.S.雖然我想知道這是否可以通過信心(用於其他目的),如果事實證明這是不可能的,那麼有沒有辦法設置WinstonJS文件傳輸的默認路徑?

回答

4

我認爲你正在尋找$base。見shared values部分中的文檔:

如果你有,你想不重複他們每個選項的各種配置對象之間共享的價值觀,你可以創建一個$base對象。

下面是它是如何與您的示例中使用:

const Confidence = require('confidence'); 

const document = { 
    $filter: 'env', 
    $base: { 
     path: 'app-core.log' 
    }, 
    development: { 
     level: { 
      console: 'debug', 
      file: 'debug' 
     } 
    }, 
    staging: { 
     level: { 
      console: 'warn', 
      file: 'warn' 
     } 
    }, 
    production: { 
     level: { 
      console: 'error', 
      file: 'error' 
     }, 
     path: 'prod-app-core.log' 
    } 
}; 

const store = new Confidence.Store(document); 

console.log(store.get('/', { env: 'production' })); 
console.log(store.get('/', { env: 'development' })); 

控制檯輸出:

{ path: 'prod-app-core.log', 
    level: { console: 'error', file: 'error' } } 
{ path: 'app-core.log', 
    level: { console: 'debug', file: 'debug' } } 

那麼什麼是$default的呢?

$default用於定義當env值在文檔中沒有對應關鍵字時應該使用的對象。如果沒有$default,你只是得到undefined該路徑:

const document = { 
    $filter: 'env', 
    $base: { 
     path: 'app-core.log' 
    }, 
    $default: { 
     level: { 
      console: 'something-else', 
      file: 'something-else' 
     } 
    }, 
    development: { 
     level: { 
      console: 'debug', 
      file: 'debug' 
     } 
    }, 
    staging: { 
     level: { 
      console: 'warn', 
      file: 'warn' 
     } 
    }, 
    production: { 
     level: { 
      console: 'error', 
      file: 'error' 
     }, 
     path: 'prod-app-core.log' 
    } 
}; 

const store = new Confidence.Store(document); 

console.log(store.get('/', { env: 'dunno' })); 

控制檯輸出:在$default水平或特定匹配濾波器值將優先於所定義的值定義

{ path: 'app-core.log', 
    level: { console: 'something-else', file: 'something-else' } } 

什麼$base

+0

是的!具有諷刺意味的是,我在我自己的JS文件中找到了'$ base',這是前一段時間,我不記得使用過它。但那就是它!謝謝 – Justin