Skip to content

Conversation

Jobians
Copy link

@Jobians Jobians commented Sep 19, 2025

This PR introduces three changes to make the pg package more compatible with Deno while
keeping full Node.js functionality:

  1. Default user value

    • Replace user: process.platform === 'win32' ? process.env.USERNAME : process.env.USER
      with user: 'postgres' in defaults.
    • Avoids requiring environment variables in Deno.
  2. Config-first parameter resolution

    • Update val() in connection-parameters.js to return config[key] first, before
      checking environment variables.
    • Prevents Deno errors when --allow-env is not granted.
  3. Safe NODE_PG_FORCE_NATIVE check

    • Wrap the NODE_PG_FORCE_NATIVE check in a try/catch.
    • Ensures process.env access in Deno doesn’t throw, while preserving Node.js behavior.

These changes maintain Node.js compatibility, preserve the lazy-loading of the native module,
and allow using the package in Deno without requiring --allow-env.

…rors

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
…meters

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.
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.
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
@Jobians Jobians requested a review from charmander September 20, 2025 13:17
@Jobians
Copy link
Author

Jobians commented Sep 25, 2025

@charmander

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants