Установка значения по умолчанию отфильтрованного объекта в объекте конфигурации HapiJS Confidence

Я использую библиотеку 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 должно быть одинаковым для всех элементов env, за исключением 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. Хотя я хотел бы знать, возможно ли это через Confidence (для других целей), если выяснится, что это невозможно, то есть ли способ установить путь по умолчанию для файла WinstonJS транспортирует?


person Justin    schedule 09.03.2016    source источник


Ответы (1)


Я думаю, вы ищете $base. См. раздел общие значения в документации:

Если у вас есть значения, которые вы хотели бы разделить между различными объектами конфигурации, не дублируя их для каждой опции, вы можете создать объект $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' }));

Вывод консоли:

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

Все, что определено на уровне $default, или определенное соответствующее значение фильтра будет иметь приоритет над значением, определенным на уровне $base.

person Matt Harrison    schedule 09.03.2016
comment
Ага! По иронии судьбы, я нашел $base в своих JS-файлах, это было совсем недавно, я не помнил, что использовал его. Но это все! Спасибо - person Justin; 10.03.2016