在 HapiJS Confidence 配置对象中设置过滤对象的默认值

Setting default value of filtered object in HapiJS Confidence configuration object

我在我的项目中使用 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. 虽然我想知道这是否可以通过置信度(用于其他目的)实现,但如果事实证明这是不可能的,那么有没有办法设置 WinstonJS 文件传输的默认路径?

我想你在找 $base。请参阅文档中的 shared values 部分:

If you have values that you would like to share between various configuration objects without duplicating them for each option, you can create a $base object.

以下是它在您的示例中的用法:

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 定义的值。