node-red-contrib-postgres-variable
Version:
PostgreSQL module for Node-RED with dynamic configuration from contexts (flow, global, environment)
316 lines (247 loc) • 9.41 kB
Markdown
# Node-RED PostgreSQL Variable Context Module
A Node-RED module for PostgreSQL database operations with support for dynamic configuration from different contexts (flow, global, environment variables).
Edited by Andrii Lototskyi
## Features
- **Dynamic Configuration**: Get database connection parameters from different contexts:
- String values (direct input)
- Flow context variables
- Global context variables
- Environment variables
- **SSL Support**: Full SSL configuration with certificate validation options
- **Named Parameters**: Support for named query parameters using node-postgres-named
- **Connection Pooling**: Efficient connection management with PostgreSQL connection pools
- **Error Handling**: Comprehensive error handling and reporting
## Installation
```bash
npm install node-red-contrib-postgres-variable
```
## Configuration
### Database Configuration Node
The PostgreSQL database configuration node supports the following parameters, each can be sourced from different contexts:
#### Connection Parameters
| Parameter | Description | Context Types | Default |
|-----------|-------------|---------------|---------|
| **Host** | PostgreSQL server hostname | str, flow, global, env | localhost |
| **Port** | PostgreSQL server port | str, flow, global, env | 5432 |
| **Database** | Database name | str, flow, global, env | - |
| **Username** | Database username | str, flow, global, env | - |
| **Password** | Database password | str, flow, global, env | - |
> **🔐 Password Security Note**: When password type is set to "str" (string), the password is securely stored in Node-RED's credentials system and displayed as a password field (hidden). For other types (flow, global, env), the password reference is stored in the flow configuration for portability.
#### SSL Parameters
| Parameter | Description | Context Types | Default |
|-----------|-------------|---------------|---------|
| **SSL** | Enable SSL connection | bool, flow, global, env | false |
| **Ignore SSL Certificate** | Skip certificate validation | bool, flow, global, env | false |
| **SSL Certificate Path** | Path to SSL certificate file | str, flow, global, env | - |
### Context Types
- **str**: Direct string value
- **flow**: Value from flow context (`flow.get(key)`)
- **global**: Value from global context (`global.get(key)`)
- **env**: Value from environment variable (`process.env[key]`)
- **bool**: Boolean value (for SSL options)
## Usage Examples
### Basic Usage
1. **Configure Database Node**:
- Host: `localhost` (string)
- Port: `5432` (string)
- Database: `mydb` (string)
- Username: `postgres` (string)
- Password: `secret` (string)
2. **Use in Flow**:
```javascript
msg.payload = "SELECT * FROM users WHERE id = $userId";
msg.queryParameters = { userId: 123 };
return msg;
```
### Dynamic Configuration from Context
#### Using Flow Context
```javascript
// Set in a function node before the postgres node
flow.set("db_host", "production-server");
flow.set("db_name", "prod_database");
```
Configure database node:
- Host: `db_host` (flow context)
- Database: `db_name` (flow context)
#### Using Global Context
```javascript
// Set in a function node
global.set("postgres_port", "5433");
global.set("postgres_user", "admin");
```
Configure database node:
- Port: `postgres_port` (global context)
- Username: `postgres_user` (global context)
#### Using Environment Variables
Set environment variables:
```bash
export DB_HOST=production-server
export DB_PORT=5432
export DB_NAME=production_db
export DB_USER=prod_user
export DB_PASSWORD=secure_password
```
Configure database node:
- Host: `DB_HOST` (environment)
- Port: `DB_PORT` (environment)
- Database: `DB_NAME` (environment)
- Username: `DB_USER` (environment)
- Password: `DB_PASSWORD` (environment)
### SSL Configuration Examples
#### SSL with Certificate Validation
```javascript
// Environment variables
export SSL_ENABLED=true
export SSL_CERT_PATH=/path/to/certificate.pem
```
Configure database node:
- SSL: `SSL_ENABLED` (environment) → `true`
- Ignore SSL Certificate: `false` (boolean)
- SSL Certificate Path: `SSL_CERT_PATH` (environment) → `/path/to/certificate.pem`
#### SSL without Certificate Validation
Configure database node:
- SSL: `true` (boolean)
- Ignore SSL Certificate: `true` (boolean)
#### Dynamic SSL from Flow Context
```javascript
// In a function node
flow.set("use_ssl", true);
flow.set("ignore_cert", false);
flow.set("cert_path", "/secure/path/cert.pem");
```
Configure database node:
- SSL: `use_ssl` (flow context)
- Ignore SSL Certificate: `ignore_cert` (flow context)
- SSL Certificate Path: `cert_path` (flow context)
## Query Examples
### Simple Query
```javascript
msg.payload = "SELECT * FROM users";
return msg;
```
### Parameterized Query
```javascript
msg.payload = "SELECT * FROM users WHERE age > $minAge AND city = $userCity";
msg.queryParameters = {
minAge: 18,
userCity: "New York"
};
return msg;
```
### Insert with Parameters
```javascript
msg.payload = "INSERT INTO users (name, email, age) VALUES ($name, $email, $age)";
msg.queryParameters = {
name: "John Doe",
email: "john@example.com",
age: 30
};
return msg;
```
### Dynamic Query from Message
```javascript
msg.payload = "SELECT * FROM " + msg.tableName + " WHERE id = $recordId";
msg.queryParameters = {
recordId: msg.payload.id
};
return msg;
```
## Custom Connection Configuration
You can also define custom connection configurations in Node-RED settings.js:
```javascript
module.exports = {
// ... other settings
pgConnects: {
"production": {
user: "prod_user",
password: "prod_password",
host: "prod-server",
port: 5432,
database: "production_db",
ssl: true,
ignore_check_ssl: false,
ssl_path: "/path/to/prod-cert.pem"
},
"development": {
user: "dev_user",
password: "dev_password",
host: "localhost",
port: 5432,
database: "dev_db",
ssl: false
}
}
};
```
Use custom connection:
```javascript
msg.connectName = "production"; // or "development"
msg.payload = "SELECT * FROM users";
return msg;
```
## Password Security
The module implements intelligent password handling based on the selected type:
### String Passwords (Secure Storage)
When password type is set to **"str"**:
- Password is stored in Node-RED's encrypted credentials system
- Input field is automatically masked with dots/asterisks (password type)
- Password is not visible in flow exports
- Field dynamically switches to hidden mode when "str" type is selected
- Ideal for static passwords in production environments
### Context Passwords (Portable Configuration)
When password type is set to **"flow"**, **"global"**, or **"env"**:
- Only the reference key is stored in flow configuration
- Input field shows plain text for easy editing of context keys
- Actual password value is resolved at runtime from the specified context
- Flow can be exported/imported without exposing passwords
- Field automatically switches to text mode for visibility of context references
- Ideal for dynamic environments and CI/CD deployments
### Example Scenarios
#### Production with Static Password
```javascript
// Configuration: Password type = "str", value = "mySecretPassword"
// Result: Password stored securely in credentials, not in flow
```
#### Development with Environment Variable
```javascript
// Configuration: Password type = "env", value = "DB_PASSWORD"
// Environment: DB_PASSWORD=dev_password_123
// Result: Password resolved from environment at runtime
```
#### Dynamic Password from Global Context
```javascript
// In a function node:
global.set("current_db_password", "dynamic_password_" + Date.now());
// Configuration: Password type = "global", value = "current_db_password"
// Result: Password resolved from global context at runtime
```
## Error Handling
The module provides comprehensive error handling:
```javascript
// Errors are sent to the node's error output
// and also attached to the message
if (msg.payload.error) {
node.warn("Database error: " + msg.payload.error);
return null; // Stop processing
}
```
## SSL Configuration Logic
The SSL configuration follows this logic:
1. **SSL = false**: No SSL connection
2. **SSL = true + Ignore SSL Certificate = true**: SSL connection without certificate validation
3. **SSL = true + Ignore SSL Certificate = false**: SSL connection with certificate validation
4. **SSL = true + Ignore SSL Certificate = false + SSL Certificate Path**: SSL with custom certificate
## Migration from Previous Versions
If you're upgrading from a previous version that used Node-RED credentials:
1. **Username and Password**: Now configured through typedInput fields instead of credentials
2. **All Fields**: Now support context resolution (flow, global, env)
3. **SSL Configuration**: Enhanced with better boolean handling and certificate path options
## Dependencies
- `pg`: PostgreSQL client for Node.js
- `node-postgres-named`: Named parameter support for node-postgres
## License
Apache License 2.0
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## Support
For issues and questions, please use the GitHub issue tracker.