JOBIANS TECHIE 6bf475c3c1
Improve Deno compatibility: config-first and safe env access (#3547)
* Set default PostgreSQL user to 'postgres' to avoid Deno env access errors

Currently, the pg package defaults the database user to process.env.USER (or USERNAME on Windows).  
This causes errors when running in Deno without --allow-env, as environment access is restricted.

This PR changes the default user to 'postgres', so:

- Node.js behavior is unchanged when a user is explicitly provided in config.
- Deno users no longer hit NotCapable errors for environment access.
- Avoids relying on process.env for default values.

Example:

Before:
user: process.platform === 'win32' ? process.env.USERNAME : process.env.USER,

After:
user: 'postgres', // default user, avoids using process.env

* Prioritize config values over environment variables in ConnectionParameters

Previously, ConnectionParameters would first check process.env for connection settings before using the provided config object. This could cause errors in environments like Deno where environment access is restricted.

This change updates the val function to:

1. Use the value from config if it is defined.


2. Fall back to environment variables only if config does not provide a value.


3. Use default values if neither config nor environment variables are set.



This ensures that explicitly provided configuration values are always respected, avoiding unnecessary errors in restricted environments.

* Wrap NODE_PG_FORCE_NATIVE check in try/catch for Deno compatibility

Replace the `typeof process.env.NODE_PG_FORCE_NATIVE !== 'undefined'` check with a try/catch
to safely handle environments like Deno without `--allow-env`.

- Keeps Node.js behavior unchanged.
- Prevents errors when accessing process.env in Deno.
- Preserves lazy loading of the native module.

* Make default database user Deno-safe

Wrap the default database user assignment in a try/catch to prevent errors when environment access is restricted (e.g., in Deno).

- Uses process.env.USER / USERNAME on Node if available
- Falls back to 'postgres' when env access fails or is unavailable
- Maintains code structure and comments
- Ensures Node tests continue to pass while preventing Deno runtime errors

* Fixing checks pass

* Update packages/pg/lib/connection-parameters.js

Co-authored-by: Charmander <~@charmander.me>

* fix(pg): only guard process.env access when forcing native client

---------

Co-authored-by: Charmander <~@charmander.me>
2026-01-14 16:26:31 -06:00

92 lines
2.4 KiB
JavaScript

'use strict'
let user
try {
user = process.platform === 'win32' ? process.env.USERNAME : process.env.USER
} catch {
// ignore, e.g., Deno without --allow-env
}
module.exports = {
// database host. defaults to localhost
host: 'localhost',
// database user's name
user,
// name of database to connect
database: undefined,
// database user's password
password: null,
// a Postgres connection string to be used instead of setting individual connection items
// NOTE: Setting this value will cause it to override any other value (such as database or user) defined
// in the defaults object.
connectionString: undefined,
// database port
port: 5432,
// number of rows to return at a time from a prepared statement's
// portal. 0 will return all rows at once
rows: 0,
// binary result mode
binary: false,
// Connection pool options - see https://github.com/brianc/node-pg-pool
// number of connections to use in connection pool
// 0 will disable connection pooling
max: 10,
// max milliseconds a client can go unused before it is removed
// from the pool and destroyed
idleTimeoutMillis: 30000,
client_encoding: '',
ssl: false,
application_name: undefined,
fallback_application_name: undefined,
options: undefined,
parseInputDatesAsUTC: false,
// max milliseconds any query using this connection will execute for before timing out in error.
// false=unlimited
statement_timeout: false,
// Abort any statement that waits longer than the specified duration in milliseconds while attempting to acquire a lock.
// false=unlimited
lock_timeout: false,
// Terminate any session with an open transaction that has been idle for longer than the specified duration in milliseconds
// false=unlimited
idle_in_transaction_session_timeout: false,
// max milliseconds to wait for query to complete (client side)
query_timeout: false,
connect_timeout: 0,
keepalives: 1,
keepalives_idle: 0,
}
const pgTypes = require('pg-types')
// save default parsers
const parseBigInteger = pgTypes.getTypeParser(20, 'text')
const parseBigIntegerArray = pgTypes.getTypeParser(1016, 'text')
// parse int8 so you can get your count values as actual numbers
module.exports.__defineSetter__('parseInt8', function (val) {
pgTypes.setTypeParser(20, 'text', val ? pgTypes.getTypeParser(23, 'text') : parseBigInteger)
pgTypes.setTypeParser(1016, 'text', val ? pgTypes.getTypeParser(1007, 'text') : parseBigIntegerArray)
})