Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: JustinОтветов: 1

Я использую библиотеку 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 транспортирует?

javascriptwinstonjavascript-objectshapijs

Ответы

Ответ 1 · рейтинг 4 · Matt Harrison

Я думаю, вы ищете $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.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы