express 생성자 함수 createApplication의 리턴값 app의 초기화 함수 init()부터 시작
app.init = function init() {
this.cache = {};
this.engines = {};
this.settings = {};
this.defaultConfiguration();
};
app.defaultConfiguration = function defaultConfiguration() {
var env = process.env.NODE_ENV || "development";
/**
* settings에 기본 설정값들을 저장한다.
*
* x-powered-by : true
* -> x로 시작하는 대부분의 http헤더들은 비공식 헤더를 의미한다.
* -> 해당 앱이 어떤 라이브러리 || 프레임워크 || 언어로 작성되었는지를 알려주기위해 만드는것 같다.
* -> 해킹을 방지하기위해 x-powered-by헤더를 포함시키지 않거나, 일부러 틀린 정보(php기반인데, APS.NET이라고 적는등의)를 기재하는 경우가 있다.
* -> 기본 세팅은 true인데 실제 작동하는 express서버에서는 해당 헤더가 보이지 않는것으로 보아 이후 값을 변경하거나 하는것 같다.
*
* https://stackoverflow.com/questions/33580671/what-does-x-powered-by-mean 참고
*
* enable : set함수를 호출한다. 이때 enable의 첫번째 인자를 set함수의 첫번째 인자로하며, set함수의 두번째 인자는 true가 된다.
*
*/
// default settings
this.enable("x-powered-by");
this.set("etag", "weak");
this.set("env", env);
this.set("query parser", "extended");
this.set("subdomain offset", 2);
this.set("trust proxy", false);
// trust proxy inherit back-compat
Object.defineProperty(this.settings, trustProxyDefaultSymbol, {
configurable: true,
value: true,
});
app.enable = function enable(setting) {
return this.set(setting, true);
}
var trustProxyDefaultSymbol = "@@symbol:trust_proxy_default";
/**
* 1. 첫번째 인자만 들어오는 경우 : 첫번째 인자를 key로하여 value를 리턴한다.
* 2. 두번째 인자도 들어오는 경우 : 첫번째 인자를 key 두번째 인자를 value로 하여 settings개체에 저장한다.
* 3. 첫번째 인자의 값이 etag, query parser, trust proxy인경우 : etag fn, query parser fn, trust proxy fn을 key 컴파일한값을 value로 하여 값을 저장한다.
* 4. 첫번째 인자의 값이 trust proxy인경우 : @@symbol:trust_proxy_default를 key, false를 value로 하여 값을 저장한다.
*/
app.set = function set(setting, val) {
/**
* setting : settings의 key 값으로 사용
* val : settings 변수의 value 값으로 사용
*/
if (arguments.length === 1) {
// app.get(setting)
return this.settings[setting];
/**
* set함수에 입력된 인자의 개수가 하나인경우 입력된 인자를 키로하여 저장된 값을 리턴한다.
*/
}
debug('set "%s" to %o', setting, val);
// set value
this.settings[setting] = val;
/**
* settings에 값을 설정한다.
*/
// trigger matched settings
switch (setting) {
case "etag":
this.set("etag fn", compileETag(val));
break;
case "query parser":
this.set("query parser fn", compileQueryParser(val));
break;
case "trust proxy":
this.set("trust proxy fn", compileTrust(val));
// trust proxy inherit back-compat
Object.defineProperty(this.settings, trustProxyDefaultSymbol, {
configurable: true,
value: false,
});
break;
}
/**
* setting값이 etag, query parser, trust proxy인경우
* val값을 기반으로 etag fn, query parser fn, truest proxy fn값을 설정한다.
* 이때 setting값이 trust proxy인경우 프로퍼티를 하나 더 추가한다.
* "@@symbol:trust_proxy_default" : true
*
* 이때 @@symbol:trust_proxy_default의 경우 Object.defineProperty로 추가하였기 때문에 enumerable이 기본값인 false로 설정되어있다.
*/
return this;
};