在HapiJS Confidence配置对象

时间:2016-03-09 18:47:34

标签: javascript node.js javascript-objects hapijs winston

我在我的项目中使用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'
    }
}

但由于pathenv应该相同,但production除外,我希望我能为path设置默认值{1}}价值。像这样:

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),那么它会占用整个临时对象,甚至不会查看{{ 1}}对象。

谢谢!

PS 虽然我想知道这是否可以通过置信度(用于其他目的),如果事实证明这是不可能的,那么有没有办法设置默认路径对于WinstonJS文件传输?

1 个答案:

答案 0 :(得分:4)

我认为你正在寻找 private static JasperDesign getPageTemplateDesign(String templatePath) throws JRException{ logger.info("Setting format page desing for Template: " + templatePath); JasperDesign design = JRXmlLoader.load(templatePath); logger.info("Setting Page Dimessions Format to: " + pageFormat); if (JRDriver.pageFormat.equals("A4")) { JRDriver.pageWidth=595; JRDriver.pageHeight=842; JRDriver.columnCount=1; JRDriver.columnWidth=555; JRDriver.columnSpacing=0; JRDriver.leftMargin=20; JRDriver.rightMargin=20; JRDriver.topMargin=20; JRDriver.bottomMargin=20; } else if (JRDriver.pageFormat.equals("LETTER")) { JRDriver.pageWidth=612; JRDriver.pageHeight=792; JRDriver.columnCount=1; JRDriver.columnWidth=517; JRDriver.columnSpacing=0; JRDriver.leftMargin=20; JRDriver.rightMargin=20; JRDriver.topMargin=20; JRDriver.bottomMargin=20; } //Setting twmplate dimesions design.setPageWidth(JRDriver.pageWidth); design.setPageHeight(JRDriver.pageHeight); design.setColumnCount(JRDriver.columnCount); design.setColumnWidth(JRDriver.columnWidth); design.setColumnSpacing(JRDriver.columnSpacing); design.setLeftMargin(JRDriver.leftMargin); design.setRightMargin(JRDriver.rightMargin); design.setTopMargin(JRDriver.topMargin); design.setBottomMargin(JRDriver.bottomMargin); return design; } private static void reformattingPageTemplate(String path) throws JRException{ logger.info("Getting Design Template from: " + path); JasperDesign design= getPageTemplateDesign(path); String destFile=path.replaceAll("jrxml", "jasper"); logger.info("Compiling Re-formated Design Template to: " + destFile); JasperCompileManager.compileReportToFile(design, destFile); } private static void formattingALLPage() throws JRException{ reformattingPageTemplate(reportBookPagesDir + "/FrontCover.jrxml"); reformattingPageTemplate(reportBookPagesDir + "/Copyright.jrxml"); reformattingPageTemplate(reportBookPagesDir + "/TableOfContent.jrxml"); reformattingPageTemplate(reportBookPagesDir + "/Summary.jrxml"); reformattingPageTemplate(reportBookPagesDir + "/Content.jrxml"); reformattingPageTemplate(reportBookPagesDir + "/AppendixWarnings.jrxml"); reformattingPageTemplate(reportBookPagesDir + "/Index.jrxml"); reformattingPageTemplate(reportBookPagesDir + "/BackCover.jrxml"); //reformattingPageTemplate(reportTemplatePath); } 。请参阅文档中的shared values部分:

  

如果您希望在各种配置对象之间共享值而不为每个选项复制它们,则可以创建$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用于定义当env值在文档中没有对应键时应使用的对象。如果没有$default,您只需获得$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定义的值。