初期化関数init(1)


expressコンストラクション関数createApplicationの戻り値appの初期化関数init()開始

app.init()

app.init = function init() {
  this.cache = {};
  this.engines = {};
  this.settings = {};

  this.defaultConfiguration();
};

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,
  });

enable

app.enable = function enable(setting) {
  return this.set(setting, true);
}

set


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;
};