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
- Use a plain data descriptor with value and all flags true
- Stub by assignment: save the old value, assign, and restore in a finally block
- 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
- Treat process.env as a string bag: only assignment and deletion
- Wrap env stubbing in one test helper that uses save/assign/restore
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
- Cannot convert a Symbol value to a string
- ERR_ASSERTION
- ERR_ASSERTION
- ERR_INVALID_ARG_TYPE
- ERR_INVALID_ARG_TYPE
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)