Cloud Config Client for Node
Requires: NodeJS 10+
Feature requests are welcome.
npm i cloud-config-client
const client = require("cloud-config-client");
client.load({
application: "invoices"
}).then((config) => {
// Look for a key
const value1 = config.get("this.is.a.key");
// Using a prefix, this is equivalent to .get("this.is.another.key");
const value2 = config.get("this.is", "another.key");
});
// Or
const config = await client.load({ application: 'invoices' })
const value1 = config.get("this.is.a.key");
load
functionObject
, mandatory:
string
, optional, default=http://localhost:8888
: Config server URL.boolean
, optional, default = true
: if false
accepts self-signed certificatesstring
, deprecated, use name: Load configuration for this application.string
, mandatory: Load the configuration with this name.string|string[]
, optional, default="default"
: Load profiles.string
, optional: Load environment.Object
, optional: Basic Authentication for access config server (e.g.: { user: "username", pass: "password"}
).
endpoint accepts also basic auth (e.g. http://user:pass@localhost:8888
).
string
, mandatorystring
, mandatoryhttp.Agent|https.Agent
, optional: Agent for the request. (e.g. use a proxy) (Since version 1.2.0)object
, optional: Context for substitution (see context section below) (Since version 1.4.0)object
, optional: Additional request headers (Since version 1.5.0)function(error: Error, config: Config)
, optional: node style callback. If missing, the method will return a promise.client.load(options)
.then((config) => { ... })
.catch((error) => { ... })
// or
client.load(options, (error, config) => { ... })
// or
async function foo () {
const config = await client.load(options)
//...
}
Strings could contain context references, if a contexts is provided those references will be replaced by the actual values in the Config
object reference.
YAML example:
key01: Hello ${NAME:World}!!!
This is not related to spEl and those references are not an expression language.
Reference structure: ${CONTEXT_KEY:DEFAULT_VALUE?}
:
CONTEXT_KEY
: Context key, if the value for the key is missing it will be use the default value or return the original stringDEFAULT_VALUE
: Optional default valueEnvironment variables as context:
Client.load({
endpoint: 'http://server:8888',
name: 'application',
context: process.env })
.then(config => {
// config loaded
}).catch(console.error)
Config
objectraw
: Spring raw response data.properties
: computed properties as per Spring specification:
Property keys in more specifically named files override those in application.properties or application.yml.
get(...parts)
: Retrieve a value at a given path or undefined. Multiple parameters can be used to calculate the key.
string
, variable, mandatory:forEach(callback, includeOverridden)
: Iterates over every key/value in the config.
function(key: string, value: string)
, mandatory: iteration callback.boolean
, optional, default=false
: if true, include overridden keys or replace
. config.get("this.is.a.key");
config.get("this.is", "a.key");
config.get("this", "is", "a", "key");
config.forEach((key, value) => console.log(key + ":" + value));
toString(spaces): string
: Returns a string representation of raw
property.
number
, optional: spaces to use in format.toObject([options]): object
: Returns the whole configuration as an object. (Since version 1.3.0).
options.merge
— specify strategy to process overlapping arrays:
// Simplified data from Spring Cloud Config:
// [
// {"key01[0]" : 5}, // ← the most specific property source
// {"key01[0]" : "string1", "key01[1]" : "string2"}
// ]
config.toObject({overlappingArrays:'merge'}) // {"key01[0]": 5, "key01[1]": "string2"}
config.toObject({overlappingArrays:'replace'}) // {"key01[0]": 5}
Example (adapted from https-proxy-agent site):
const HttpsProxyAgent = require('https-proxy-agent')
const client = require('cloud-config-client')
const proxy = process.env.http_proxy || 'http://168.63.76.32:3128'
console.log('using proxy server %j', proxy)
const agent = new HttpsProxyAgent(proxy)
const options = {
application: 'demo',
profiles: ['test', 'timeout'],
agent
}
client.load(options).then((cfg) => {
console.log(cfg.get('test.users', 'multi.uid'))
console.log(cfg.toString(2))
}).catch((error) => console.error(error))