Skip to content

Commit f88476a

Browse files
committed
src: delete proccess.env values set to undefined
Before this commit, setting a property of process.env to undefined would set the value to the string "undefined". This changes the behavior to instead remove the value, working like the delete operator. Refs: #15089
1 parent 9870b53 commit f88476a

File tree

3 files changed

+40
-11
lines changed

3 files changed

+40
-11
lines changed

doc/api/process.md

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,11 @@ emitMyWarning();
836836
## process.env
837837
<!-- YAML
838838
added: v0.1.27
839+
changes:
840+
- version: REPLACEME
841+
pr-url: https://github.com/nodejs/node/pull/18158
842+
description: Assigning a property to `undefined` now deletes it from the
843+
environment.
839844
-->
840845

841846
* {Object}
@@ -885,12 +890,13 @@ Example:
885890
process.env.test = null;
886891
console.log(process.env.test);
887892
// => 'null'
888-
process.env.test = undefined;
893+
process.env.test = 42;
889894
console.log(process.env.test);
890-
// => 'undefined'
895+
// => '42'
891896
```
892897

893-
Use `delete` to delete a property from `process.env`.
898+
Use `delete` to delete a property from `process.env` or assign it to
899+
`undefined`.
894900

895901
Example:
896902

@@ -899,6 +905,10 @@ process.env.TEST = 1;
899905
delete process.env.TEST;
900906
console.log(process.env.TEST);
901907
// => undefined
908+
process.env.TEST = 1;
909+
process.env.TEST = undefined;
910+
console.log('TEST' in process.env);
911+
// => false
902912
```
903913

904914
On Windows operating systems, environment variables are case-insensitive.

src/node.cc

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2697,6 +2697,18 @@ static void ProcessTitleSetter(Local<Name> property,
26972697
}
26982698

26992699

2700+
inline void RemovePropertyFromEnv(Isolate* isolate, Local<Name> property) {
2701+
#ifdef __POSIX__
2702+
node::Utf8Value key(isolate, property);
2703+
unsetenv(*key);
2704+
#else
2705+
node::TwoByteValue key(isolate, property);
2706+
WCHAR* key_ptr = reinterpret_cast<WCHAR*>(*key);
2707+
SetEnvironmentVariableW(key_ptr, nullptr);
2708+
#endif
2709+
}
2710+
2711+
27002712
static void EnvGetter(Local<Name> property,
27012713
const PropertyCallbackInfo<Value>& info) {
27022714
Isolate* isolate = info.GetIsolate();
@@ -2731,6 +2743,11 @@ static void EnvGetter(Local<Name> property,
27312743
static void EnvSetter(Local<Name> property,
27322744
Local<Value> value,
27332745
const PropertyCallbackInfo<Value>& info) {
2746+
if (value->IsUndefined()) {
2747+
RemovePropertyFromEnv(info.GetIsolate(), property);
2748+
info.GetReturnValue().Set(value);
2749+
return;
2750+
}
27342751
#ifdef __POSIX__
27352752
node::Utf8Value key(info.GetIsolate(), property);
27362753
node::Utf8Value val(info.GetIsolate(), value);
@@ -2780,14 +2797,7 @@ static void EnvQuery(Local<Name> property,
27802797
static void EnvDeleter(Local<Name> property,
27812798
const PropertyCallbackInfo<Boolean>& info) {
27822799
if (property->IsString()) {
2783-
#ifdef __POSIX__
2784-
node::Utf8Value key(info.GetIsolate(), property);
2785-
unsetenv(*key);
2786-
#else
2787-
node::TwoByteValue key(info.GetIsolate(), property);
2788-
WCHAR* key_ptr = reinterpret_cast<WCHAR*>(*key);
2789-
SetEnvironmentVariableW(key_ptr, nullptr);
2790-
#endif
2800+
RemovePropertyFromEnv(info.GetIsolate(), property);
27912801
}
27922802

27932803
// process.env never has non-configurable properties, so always

test/parallel/test-process-env.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,12 @@ if (common.isWindows) {
100100
assert.strictEqual(process.env.test, undefined);
101101
assert.strictEqual(process.env.teST, undefined);
102102
}
103+
104+
{
105+
// Setting an environment variable to undefined should act like a delete.
106+
process.env.UNDEF = 'test';
107+
assert.strictEqual(process.env.UNDEF, 'test');
108+
process.env.UNDEF = undefined;
109+
assert.strictEqual(process.env.UNDEF, undefined);
110+
assert.strictEqual('UNDEF' in process.env, false);
111+
}

0 commit comments

Comments
 (0)