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:
- Set up node-config in your Watt application
- Create environment-specific configurations
- Configure individual services with their own settings
- 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"
}
}
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:
- Set your service-specific environment variable:
SERVICE_A_NODE_ENV=development
- 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:
default.json
(base configuration){environment}.json
(environment-specific settings)local.json
(local overrides, should be git-ignored)- Environment variables
- 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:
- Set up monitoring - Monitor configuration across environments
- Deploy with multiple environments - Production deployment patterns
- Add configuration validation - Ensure configuration correctness
- Implement feature flags - Dynamic configuration management
Additional Resources
- Watt Setup Guide - Basic Watt application setup
- Node-config Documentation - Complete configuration patterns and options
- Environment Variables Guide - Basic environment variable usage with Watt