npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

spring-cloud-config

v4.6.6

Published

NodeJS application configuration using similar style to Spring Config and using the Spring Cloud Config Server for remote property sources.

Downloads

1,919

Readme

Spring-like Cloud Config for NodeJS Applications

NPM Version Build Status Coverage Status

NodeJS application configuration using similar style to Spring Config and using the Spring Cloud Config Server for remote property sources.

Depends on cloud-config-client for the config server client functionality.

Feature requests are welcome.

Introduction

You get to define your application properties the same way you do in your Spring Boot applications. Use a bootstrap.yml file to specify your config server settings and application.yml to hold your local application properties. This module even supports profiling, similar to Spring Boot profiles, giving you the option to define profile-based properties in either separate files, like application-{profile}.yml, or in a single multi-document yaml file using a profiles property on the applicable documents, like profiles: profile1,profile2.

Getting Started

Install the package

npm install spring-cloud-config

Define an application.yml, or a group of application.yml and application-{profile}.yml files, in the location of your choice.

application.yml

spring.cloud.config.name: my-application-name
db:
   mongo:
      url: http://localhost:27017
---
profiles: dev1,dev2
db:
   mongo:
      url: http://dev-mongo-server:27017

Define a bootstrap.yml in the location of your choice.

bootstrap.yml

spring:
   cloud:
      config:
         enabled: true
         endpoint: http://localhost:8888
         label: master
---
profiles: dev1,dev2
spring.cloud.config.endpoint: http://dev-config-server:8888

Load your configuration during startup/initialization.

const SpringCloudConfig = require('spring-cloud-config');

const configOptions = {
    configPath: __dirname + '/config',
    activeProfiles: ['dev1'],
    level: 'debug'
};
let myConfig;

SpringCloudConfig.load(configOptions).then(theConfig => {
   myConfig = theConfig;
   // now run your application with the loaded config props.
   // do this by saving the returned config object somewhere,
   // or by using the SpringCloudConfig.instance() helper.
);

Use the config later on in your code.

const SpringCloudConfig = require('spring-cloud-config');

const myConfig = SpringCloudConfig.instance();
console.log(`My Mongo DB URL: ${myConfig.db.mongo.url}`);

Using typescript? No problem...

import { Config, CloudConfigOptions, ConfigObject } from 'spring-cloud-config';

const cloudConfigOptions: CloudConfigOptions = {
    configPath: __dirname + '/config',
    activeProfiles: ['dev1'],
    level: 'debug'
};

let myConfig: ConfigObject;

Config.load(cloudConfigOptions).then((theConfig: ConfigObject) => {
   myConfig = theConfig;
   // now run your application with the loaded config props.
   // do this by saving the returned config object somewhere,
   // or by using the Config.instance() helper.
);

Now you can use the config properties later on.

import { Config } from 'spring-cloud-config';

console.log(`My Mongo DB URL: ${Config.instance().db.mongo.url}`);

Things Explained

The Yaml Files

As mentioned above, this module uses Yaml files to configure your application properties. You need to supply folder paths where it can expect to find two sets of files: bootstrap.yml and application.yml. The bootstrap yaml is used to configure your cloud config server properties, similar to Spring Cloud Config. The application yaml should be used for defining your application's configuration properties. Optionally, you can specify your application's name in application.yml instead of in bootstrap.yml, using the spring.cloud.config.name property. Doing so gives you the option of using a shared bootstrap.yml (i.e. shared with other apps) but still be able to specify your individual application's name.

Support for Profiles in Multi-Document Yaml

As with any Yaml implementation you can include multiple documents in a single Yaml file, using --- as a separator. Additionally, this module allows you to define documents that apply to specific 'profiles', same as the 'spring.profiles' concept. If you include a profiles property in a given yaml document, the properties in that document will only be included in your merged configuration result if any of the configOptions.activeProfiles match up with the specified profiles.

Example application.yml

spring.cloud.config.name: my-application-name
db:
   mongo:
      url: http://localhost:27017
---
profiles: dev1,dev2,!local
db:
   mongo:
      url: http://dev-mongo-server:27017

Applying Yaml Docs to Multiple Profiles

You can apply the properties of a Yaml doc to multiple application profiles. Just provide a comma separated string of profile names in the doc's profiles property, like profiles: dev1,dev2.

Excluding Yaml Docs from Profiles

This module supports the Not operator (!) on profiles to provide for excluding configuration properties from specific profiles. Just prepend an '!' to the profile name you want to exclude the given yaml doc from, like profiles: dev1,!dev2.

Support for Profile-Specific File Names

If your application supports a wide range of profiles and/or properties then you might consider using profile-specific file names for your application.yml. Wherever you keep your application.yml, just add more yaml files named with this pattern: application-{profile}.yml.

Examples

application.yml
application-local.yml
application-dev.yml
application-dev2.yml
application-prod.yml

Node Env Property Sources

This module provides some pre-defined properties/property sources from the Node env. This enables you to exclude sensitive data from your repository files and instead provide them using environment variables. For example, you might want to exclude the username and password used for authenticating with your remote config server from your git repo.

When set, node env variables will be mapped to their respective config properties during the bootstrap phase. Be aware, env variables take highest precedence so they'll override whatever value is provided from other sources.

Pre-Defined Env Variable Mappings

| Env Variable Name | Type | Usage | | --- | --- | --- | | SPRING_CONFIG_ENDPOINT | string | Maps to spring.cloud.config.endpoint.Example: SPRING_CONFIG_ENDPOINT=http://test:8888 node index.js | | SPRING_CONFIG_AUTH_USER | string | Maps to spring.cloud.config.auth.user.Example: SPRING_CONFIG_AUTH_USER=user1 node index.js | | SPRING_CONFIG_AUTH_PASS | string | Maps to spring.cloud.config.auth.pass.Example: SPRING_CONFIG_AUTH_PASS=user1password node index.js | | APPLICATION_JSON | Stringified JSON Object | When APPLICATION_JSON is set in Node env, the value will be read into the application's configuration as a high priority set of properties.Example: APPLICATION_JSON='{ "testProp": "testValue" }' node index.js |

Remote Property Sources

If you enable the use of spring cloud config via the bootstrap property spring.cloud.config.enabled: true, the properties in application.yml will be overridden by any of the same properties defined in your remote sources. Keep in mind, however, any error encountered while reaching the remote property sources will be ignored, unless you set the bootstrap property spring.cloud.config.fail-fast: true. As a best practice, it is recommended that the properties defined in application.yml be kept up to date and represent the most current state of the application (as much as reasonably possible).

Cloud Config Client Fail Fast

If you need spring-cloud-config to throw an error when it can't reach the cloud config server, set the bootstrap property spring.cloud.config.fail-fast: true. Combine this with enabling retry (see below) to provide some resiliency to your cloud configuration retrieval.

Cloud Config Client Retry

If you'd like spring-cloud-config to retry connecting to your cloud config server after a failure, set the bootstrap property spring.cloud.config.retry.enabled: true, in addition to setting fail-fast to true (see above). When retry is enabled, spring-cloud-config will retry the config server connection based on the retry configuration you provide, or based on the default configuration. Below are the retry properties and their defaults. See the API specs further down for details.

  • spring.cloud.config.retry.enabled: false
  • spring.cloud.config.retry.max-attempts: 6
  • spring.cloud.config.retry.max-interval: 1500 (ms)
  • spring.cloud.config.retry.initial-interval: 1000 (ms)
  • spring.cloud.config.retry.multiplier: 1.1

API

load function

Reads all defined property sources, including remote cloud config properties (if enabled), and returns the merged configuration properties object.

Parameter | Type | Description --------- | ---- | ----------- options | Object | (Required) Holds the options properties that help you configure the behavior of this module. options.bootstrapPath | String | (Optional) The folder path to your bootstrap config file. If not provided, then options.configPath location must contain both bootstrap.yml and application.yml. options.configPath | String | (Required) The folder path to your yaml config file(s). options.activeProfiles | String[] | (Required) Profile names to filter your local yaml documents, as well as your remote property sources, by. options.level | String | (Optional) Logging level to use.

instance function

Returns the current configuration properties object. Use the load function prior to using this.

bootstrap.yml Cloud Config Options

Option | Type | Description ------ | -------- | ----------- spring.cloud.config | object | (Required) The config options to use for fetching remote properties from a Spring Cloud Config Server. spring.cloud.config.enabled | boolean | (Required) Enable/disable the usage of remote properties via a Spring Cloud Config Server. spring.cloud.config.fail-fast | boolean | (Optional, Default: false) Enable/disable throwing an error when remote config retrieval fails. spring.cloud.config.retry | object | (Optional) Controls the retry logic for remote configuration retrieval. spring.cloud.config.retry.enabled | boolean | (Optional, Default: false) Enable/disable retry. If enabled, retrieval of remote configuration properties will be retried if it fails. See additional properties below. spring.cloud.config.retry.max-attempts | number | (Optional, Default: 6) Maximum times to retry. spring.cloud.config.retry.max-interval | number | (Optional, Default: 1500) Maximum interval in milliseconds to wait between retries. spring.cloud.config.retry.initial-interval | number | (Optional, Default: 1000) Initial interval in milliseconds to wait before the first retry. spring.cloud.config.retry.multiplier | number | (Optional, Default: 1.1) Factor by which the retry interval will increase between retries. profiles | string | (Optional) Comma separated string of profiles. Indicates which profiles the properties in the current yaml document apply to. spring.cloud.config.name | String | (Optional) The application name to be used for reading remote properties. Alternatively, if not provided here, this must be specified in your application.yml. spring.cloud.config.endpoint | String | (Optional, Default: http://localhost:8888) The url endpoint of the Spring Cloud Config Server. spring.cloud.config.label | String | (Optional, Default: master) The cloud config label to use. spring.cloud.config.rejectUnauthorized | boolean | (Optional, Default: true) if false accepts self-signed certificates spring.cloud.config.auth | Object | (Optional) Basic Authentication for config server (e.g.: { user: "username", pass: "password"}). endpoint accepts also basic auth (e.g. http://user:pass@localhost:8888). spring.cloud.config.auth.user | string | (Required) username if using auth spring.cloud.config.auth.pass | string | (Required) password if using auth

application.yml Application Config Properties

Option | Type | Description ------ | -------- | ----------- spring.cloud.config.name | String | (Optional) You can override/specify your application name here, or in bootstrap.yml. This is an option so that you can share bootstrap.yml with other applications but still use your own application name. profiles | string | (Optional) Comma separated string of profiles. Indicates which profiles the properties in the current yaml document apply to. any.property.you.need | ? | This is where you define whatever properties your application needs to be awesome!