Node: Cannot delete property from process.env

Created on 31 May 2019  路  7Comments  路  Source: nodejs/node

  • Version: 12.3.1
  • Platform: Darwin Kernel Version 18.6.0: Thu Apr 25 23:16:27 PDT 2019; root:xnu-4903.261.4~2/RELEASE_X86_64 x86_64
  • Subsystem: process

Configuring a property on the process.env object and deleting it results in weird behaviour.

Documented in gist//60e654342532f80ae264128909e84198

curl -s https://gist.githubusercontent.com/iamogbz/60e654342532f80ae264128909e84198/raw/9329e2a1595b3b365d43ca5e59f242251df56f96/process.env.test.js | node

Seems like once a property has been configured with a getter setter, then the property can never be truly deleted from the process.env object

process

Most helpful comment

@Himself65 It's here:

https://github.com/nodejs/node/blob/aa8b820aaa4d36085baaf8beb1187b2b9955fffb/src/node_env_var.cc#L397-L399

I agree with @addaleax that it's because of the missing GenericNamedPropertyDefinerCallback. There's an overload of NamedPropertyHandlerConfiguration that accepts a definer callback.

That said, accessors or non-configurable/enumerable/writable properties aren't meaningful on process.env. I think the logical course of action is to throw an exception or add a note to the docs saying "don't do that" - or both.

All 7 comments

output on node v10.15

>>> plain object <<<
prop is not defined
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false

prop is declared as 1 with assignment (=)
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true

prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false

prop is configured as 1 with value
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true

prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false

prop is configured as 1 with getter|setter
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true

prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false

prop is redeclared as 1 with assignment (=)
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true

prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false


>>> process.env <<<
prop is not defined
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false

prop is declared as 1 with assignment (=)
value "1"
hasProperty undefinedProp true
ownProperty undefinedProp true

prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false

prop is configured as 1 with value
value "1"
hasProperty undefinedProp true
ownProperty undefinedProp true

prop is deleted true
value undefined
hasProperty undefinedProp false
ownProperty undefinedProp false

prop is configured as 1 with getter|setter
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true

prop is deleted true
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true

prop is redeclared as 1 with assignment (=)
value "1"
hasProperty undefinedProp true
ownProperty undefinedProp true

prop is deleted true
value 1
hasProperty undefinedProp true
ownProperty undefinedProp true

This seems to me to be correct. by default, values added using Object.defineProperty() are immutable.

Delete Operator

edited: should not return true(delete env[prop]).

Fwiw, this is happening because the NamedPropertyHandlerConfiguration we use for process.env does not handle Object.defineProperty() (although we could add that), but we do handle delete and still actually attempt to delete the environment variable.

It鈥檚 not obvious to me what we should do when Object.defineProperty() with a getter/setter pair is used on process.env.

where is code related code? I couldn't find...馃槙

@Himself65 It's here:

https://github.com/nodejs/node/blob/aa8b820aaa4d36085baaf8beb1187b2b9955fffb/src/node_env_var.cc#L397-L399

I agree with @addaleax that it's because of the missing GenericNamedPropertyDefinerCallback. There's an overload of NamedPropertyHandlerConfiguration that accepts a definer callback.

That said, accessors or non-configurable/enumerable/writable properties aren't meaningful on process.env. I think the logical course of action is to throw an exception or add a note to the docs saying "don't do that" - or both.

yes, I think no one will add a changeable value on process.env.馃

but, I'm trying to add something to fix it

Was this page helpful?
0 / 5 - 0 ratings