Skip to main content
Version: Next

How to Use Watt with Node Config

Problem

You need sophisticated configuration management for your Watt application that:

  • Organizes settings across multiple environments (dev, staging, production)
  • Supports complex configuration hierarchies and inheritance
  • Validates configuration values at startup
  • Allows per-service configuration in multi-service applications

When to use this solution:

  • Applications with complex configuration requirements
  • Multi-environment deployments with different settings
  • Team environments where configuration consistency is critical
  • Applications requiring configuration validation and type safety

Solution Overview

Node-config provides hierarchical configuration management that works seamlessly with Watt. This guide shows you how to:

  1. Set up node-config in your Watt application
  2. Create environment-specific configurations
  3. Configure individual services with their own settings
  4. Validate and access configuration values safely

Installation and Setup

First, install node-config in the root of your Watt application:

npm install config

Create a config directory in your service folder and set up your default configuration for each service:

mkdir config
touch config/default.json

In {service}/config/default.json, add your base configuration:

{
"foo": "bar"
}

Environment-specific configuration

For development-specific settings, create a separate configuration file:

touch config/dev.json

In {service}/config/dev.json, override any default values:

{
"foo": "baz"
}

Configuration structure

Instead of using simple key-value pairs, consider organizing your configurations more systematically, below is an example:

{
"server": {
"port": 3000,
"host": "localhost"
},
"api": {
"endpoint": "http://api.example.com",
"timeout": 5000
},
"database": {
"url": "mongodb://localhost:27017",
"name": "myapp"
}
}
important

It's important to note that for a secure configuration, use your environment variables for your application secrets and validate your configuration values when you run your application.

Service-Specific Configuration

You can configure each service environment variables in your Watt configuration file:

{
"services": [
{
"id": "service-a",
"path": "./services/service-a",
"env": {
"NODE_CONFIG_DIR": "./services/service-a/config",
"NODE_ENV": "development"
}
},
{
"id": "service-b",
"path": "./services/service-b",
"env": {
"NODE_CONFIG_DIR": "./services/service-b/config",
"NODE_ENV": "production"
}
}
]
}

Platformatic allows you to use .env files for managing environment variables, and you can remap one variable to another using its interpolation feature. For example, to remap SERVICE_A_NODE_ENV to NODE_ENV, create a .env file in the service-a directory:

  1. Set your service-specific environment variable:
SERVICE_A_NODE_ENV=development
  1. Use interpolation syntax ${VARIABLE_NAME} in your Watt configuration to reference it:
{
"services": [
{
"id": "service-a",
"path": "./services/service-a",
"env": {
"NODE_CONFIG_DIR": "./services/service-a/config",
"NODE_ENV": `${YOUR_SERVICE_NODE_ENV}`
}
}
]
}

You can alsp use this pattern with env file:

SERVICE_A_NODE_ENV=development

You can also specify environment files per Platformatic service:

{
"services": [
{
"id": "service-a",
"path": "./services/service-a",
"envfile": "./services/service-a/.env"
}
]
}

Using Configuration Values in Watt Application

Here's how to access your configuration values in a Watt application:

import { createServer } from 'http';
import config from 'config';

// Access configuration values using config.get()
const configValue = config.get('foo');

const server = createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
// Use configuration values in your application logic
res.end(config.get('foo'));
});

server.listen(3000);

Running Your Watt Application

When you start your application, node-config automatically loads the appropriate configuration based on your NODE_ENV environment variable. The values from default.json are merged with any environment-specific configurations.

For production mode:

npm start 

For development mode:

NODE_ENV=development npm start

Advanced Usage Tips

node-config follows this loading order:

  1. default.json (base configuration)
  2. {environment}.json (environment-specific settings)
  3. local.json (local overrides, should be git-ignored)
  4. Environment variables
  5. Command line arguments

Error Handling

Always handle configuration access safely:

try {
const value = config.get('foo');
} catch (error) {
console.error('Missing required configuration:', error.message);
process.exit(1);
}

Configuration Validation

We recommend using schema validation libraries like TypeBox, Ajv, or Zod to validate Watt node configurations, ensuring both runtime validation and type safety for your configuration parameters.

Verification and Testing

Test Configuration Loading

1. Create a test script to verify configuration:

// test-config.js
import config from 'config'

console.log('Configuration loaded successfully:')
console.log('Environment:', process.env.NODE_ENV || 'default')
console.log('Server config:', config.get('server'))
console.log('Database config:', config.get('database'))

// Test configuration validation
try {
const apiTimeout = config.get('api.timeout')
if (apiTimeout < 1000) {
console.warn('API timeout is very low:', apiTimeout)
}
} catch (error) {
console.error('Configuration error:', error.message)
}

2. Test different environments:

# Test default configuration
node test-config.js

# Test development environment
NODE_ENV=development node test-config.js

# Test production environment
NODE_ENV=production node test-config.js

Verify Service-Specific Configuration

Test that each service loads its own configuration:

# Start your Watt application
npm run dev

# Check service logs for configuration loading
# Each service should show its specific config values

Troubleshooting

Configuration Not Loading

Problem: Config values are undefined or using defaults

Solutions:

  • Verify NODE_CONFIG_DIR points to correct directory
  • Check configuration file naming (default.json, development.json, etc.)
  • Ensure JSON syntax is valid
  • Verify environment variable NODE_ENV is set correctly

Service Configuration Conflicts

Problem: Services are using wrong configuration

Solutions:

  • Check that each service has its own NODE_CONFIG_DIR environment variable
  • Verify service-specific configuration files exist
  • Ensure no configuration file naming conflicts
  • Review service startup logs for configuration loading messages

Environment Variable Issues

Problem: Environment variables not being interpolated

Solutions:

  • Verify environment variables are set before starting application
  • Check interpolation syntax: ${VARIABLE_NAME}
  • Ensure variables exist in current shell environment
  • Test variable substitution with simple values first

Next Steps

Now that you have sophisticated configuration management:

Additional Resources