denoland/deno · error · TypeError

ERR_INVALID_OBJECT_DEFINE_PROPERTY

ERR_INVALID_OBJECT_DEFINE_PROPERTY

Error message

'process.env' does not accept an accessor(getter/setter) descriptor

What it means

ERR_INVALID_OBJECT_DEFINE_PROPERTY from process.env's defineProperty trap: environment entries are plain string data properties, so accessor descriptors cannot be honored. Any defineProperty call whose attributes include a get or set key (even alongside value) throws "'process.env' does not accept an accessor(getter/setter) descriptor" immediately.

Solutions

  1. Use a plain data descriptor with value and all flags true
  2. Stub by assignment: save the old value, assign, and restore in a finally block
  3. Mock configuration at a higher level (inject a config object) instead of redefining process.env

Example fix

// before
Object.defineProperty(process.env, 'NODE_ENV', { get: () => 'test', configurable: true }); // throws

// after
const prev = process.env.NODE_ENV;
process.env.NODE_ENV = 'test';
try { runTests(); } finally { process.env.NODE_ENV = prev; }
Defensive patterns

Strategy: validation

Validate before calling

function defineEnv(name, value) {
  Object.defineProperty(process.env, name, {
    value: String(value),
    writable: true,
    enumerable: true,
    configurable: true,
  });
}

Type guard

const isDataDescriptor = (d) => !('get' in d) && !('set' in d);

Prevention

When it happens

Trigger: Object.defineProperty(process.env, 'FOO', { get: () => 'x', configurable: true }); — typical of mocking libraries or code trying to make env reads reactive.

Common situations: Test helpers stubbing env with getters; proxying process.env onto another object while preserving descriptors; DI containers registering env as a dynamic property.

Related errors


AI-assisted analysis of denoland/deno@9ad36f7a2c (2026-08-20). Data as JSON: /api/errors/3a0a529053d177c6. Report an issue: GitHub.

Appendix: source

Thrown at ext/node/polyfills/_process/process.ts:182

      }

      return typeof denoEnvGet(prop) === "string";
    },
    deleteProperty(target, key) {
      if (typeof key === "symbol") {
        delete target[key];
        return true;
      }

      Deno.env.delete(String(key));
      return true;
    },
    defineProperty(target, property, attributes) {
      if (
        ObjectHasOwn(attributes, "get") ||
        ObjectHasOwn(attributes, "set")
      ) {
        throw new ERR_INVALID_OBJECT_DEFINE_PROPERTY(
          "'process.env' does not accept an " +
            "accessor(getter/setter) descriptor",
        );
      }

      if (
        !attributes?.configurable || !attributes?.enumerable ||
        !attributes?.writable
      ) {
        throw new ERR_INVALID_OBJECT_DEFINE_PROPERTY(
          "'process.env' only accepts a " +
            "configurable, writable," +
            " and enumerable data descriptor",
        );
      }

      if (typeof property === "symbol") {
        ReflectDefineProperty(target, property, {

View on GitHub (pinned to 9ad36f7a2c)