Util#

Stability: 2 - Stable

Source Code:lib/util.js

Thenode:util module supports the needs of Node.js internal APIs. Many of theutilities are useful for application and module developers as well. To accessit:

import utilfrom'node:util';const util =require('node:util');

util.callbackify(original)#

Added in: v8.2.0

Takes anasync function (or a function that returns aPromise) and returns afunction following the error-first callback style, i.e. takingan(err, value) => ... callback as the last argument. In the callback, thefirst argument will be the rejection reason (ornull if thePromiseresolved), and the second argument will be the resolved value.

import { callbackify }from'node:util';asyncfunctionfn() {return'hello world';}const callbackFunction =callbackify(fn);callbackFunction((err, ret) => {if (err)throw err;console.log(ret);});const { callbackify } =require('node:util');asyncfunctionfn() {return'hello world';}const callbackFunction =callbackify(fn);callbackFunction((err, ret) => {if (err)throw err;console.log(ret);});

Will print:

hello world

The callback is executed asynchronously, and will have a limited stack trace.If the callback throws, the process will emit an'uncaughtException'event, and if not handled will exit.

Sincenull has a special meaning as the first argument to a callback, if awrapped function rejects aPromise with a falsy value as a reason, the valueis wrapped in anError with the original value stored in a field namedreason.

functionfn() {returnPromise.reject(null);}const callbackFunction = util.callbackify(fn);callbackFunction((err, ret) => {// When the Promise was rejected with `null` it is wrapped with an Error and// the original value is stored in `reason`.  err &&Object.hasOwn(err,'reason') && err.reason ===null;// true});

util.debuglog(section[, callback])#

Added in: v0.11.3
  • section<string> A string identifying the portion of the application forwhich thedebuglog function is being created.
  • callback<Function> A callback invoked the first time the logging functionis called with a function argument that is a more optimized logging function.
  • Returns:<Function> The logging function

Theutil.debuglog() method is used to create a function that conditionallywrites debug messages tostderr based on the existence of theNODE_DEBUGenvironment variable. If thesection name appears within the value of thatenvironment variable, then the returned function operates similar toconsole.error(). If not, then the returned function is a no-op.

import { debuglog }from'node:util';const log =debuglog('foo');log('hello from foo [%d]',123);const { debuglog } =require('node:util');const log =debuglog('foo');log('hello from foo [%d]',123);

If this program is run withNODE_DEBUG=foo in the environment, thenit will output something like:

FOO 3245: hello from foo [123]

where3245 is the process id. If it is not run with thatenvironment variable set, then it will not print anything.

Thesection supports wildcard also:

import { debuglog }from'node:util';const log =debuglog('foo');log('hi there, it\'s foo-bar [%d]',2333);const { debuglog } =require('node:util');const log =debuglog('foo');log('hi there, it\'s foo-bar [%d]',2333);

if it is run withNODE_DEBUG=foo* in the environment, then it will outputsomething like:

FOO-BAR 3257: hi there, it's foo-bar [2333]

Multiple comma-separatedsection names may be specified in theNODE_DEBUGenvironment variable:NODE_DEBUG=fs,net,tls.

The optionalcallback argument can be used to replace the logging functionwith a different function that doesn't have any initialization orunnecessary wrapping.

import { debuglog }from'node:util';let log =debuglog('internals',(debug) => {// Replace with a logging function that optimizes out// testing if the section is enabled  log = debug;});const { debuglog } =require('node:util');let log =debuglog('internals',(debug) => {// Replace with a logging function that optimizes out// testing if the section is enabled  log = debug;});

debuglog().enabled#

Added in: v14.9.0

Theutil.debuglog().enabled getter is used to create a test that can be usedin conditionals based on the existence of theNODE_DEBUG environment variable.If thesection name appears within the value of that environment variable,then the returned value will betrue. If not, then the returned value will befalse.

import { debuglog }from'node:util';const enabled =debuglog('foo').enabled;if (enabled) {console.log('hello from foo [%d]',123);}const { debuglog } =require('node:util');const enabled =debuglog('foo').enabled;if (enabled) {console.log('hello from foo [%d]',123);}

If this program is run withNODE_DEBUG=foo in the environment, then it willoutput something like:

hello from foo [123]

util.debug(section)#

Added in: v14.9.0

Alias forutil.debuglog. Usage allows for readability of that doesn't implylogging when only usingutil.debuglog().enabled.

util.deprecate(fn, msg[, code])#

History
VersionChanges
v10.0.0

Deprecation warnings are only emitted once for each code.

v0.8.0

Added in: v0.8.0

Theutil.deprecate() method wrapsfn (which may be a function or class) insuch a way that it is marked as deprecated.

import { deprecate }from'node:util';exportconst obsoleteFunction =deprecate(() => {// Do something here.},'obsoleteFunction() is deprecated. Use newShinyFunction() instead.');const { deprecate } =require('node:util');exports.obsoleteFunction =deprecate(() => {// Do something here.},'obsoleteFunction() is deprecated. Use newShinyFunction() instead.');

When called,util.deprecate() will return a function that will emit aDeprecationWarning using the'warning' event. The warning willbe emitted and printed tostderr the first time the returned function iscalled. After the warning is emitted, the wrapped function is called withoutemitting a warning.

If the same optionalcode is supplied in multiple calls toutil.deprecate(),the warning will be emitted only once for thatcode.

import { deprecate }from'node:util';const fn1 =deprecate(() =>'a value','deprecation message','DEP0001',);const fn2 =deprecate(() =>'a  different value','other dep message','DEP0001',);fn1();// Emits a deprecation warning with code DEP0001fn2();// Does not emit a deprecation warning because it has the same codeconst { deprecate } =require('node:util');const fn1 =deprecate(function() {return'a value';  },'deprecation message','DEP0001',);const fn2 =deprecate(function() {return'a  different value';  },'other dep message','DEP0001',);fn1();// Emits a deprecation warning with code DEP0001fn2();// Does not emit a deprecation warning because it has the same code

If either the--no-deprecation or--no-warnings command-line flags areused, or if theprocess.noDeprecation property is set totrueprior tothe first deprecation warning, theutil.deprecate() method does nothing.

If the--trace-deprecation or--trace-warnings command-line flags are set,or theprocess.traceDeprecation property is set totrue, a warning and astack trace are printed tostderr the first time the deprecated function iscalled.

If the--throw-deprecation command-line flag is set, or theprocess.throwDeprecation property is set totrue, then an exception will bethrown when the deprecated function is called.

The--throw-deprecation command-line flag andprocess.throwDeprecationproperty take precedence over--trace-deprecation andprocess.traceDeprecation.

util.diff(actual, expected)#

Added in: v23.11.0, v22.15.0

Stability: 1 - Experimental

  • actual<Array> |<string> The first value to compare

  • expected<Array> |<string> The second value to compare

  • Returns:<Array> An array of difference entries. Each entry is an array with two elements:

    • 0<number> Operation code:-1 for delete,0 for no-op/unchanged,1 for insert
    • 1<string> The value associated with the operation
  • Algorithm complexity: O(N*D), where:

  • N is the total length of the two sequences combined (N = actual.length + expected.length)

  • D is the edit distance (the minimum number of operations required to transform one sequence into the other).

util.diff() compares two string or array values and returns an array of difference entries.It uses the Myers diff algorithm to compute minimal differences, which is the same algorithmused internally by assertion error messages.

If the values are equal, an empty array is returned.

const { diff } =require('node:util');// Comparing stringsconst actualString ='12345678';const expectedString ='12!!5!7!';console.log(diff(actualString, expectedString));// [//   [0, '1'],//   [0, '2'],//   [1, '3'],//   [1, '4'],//   [-1, '!'],//   [-1, '!'],//   [0, '5'],//   [1, '6'],//   [-1, '!'],//   [0, '7'],//   [1, '8'],//   [-1, '!'],// ]// Comparing arraysconst actualArray = ['1','2','3'];const expectedArray = ['1','3','4'];console.log(diff(actualArray, expectedArray));// [//   [0, '1'],//   [1, '2'],//   [0, '3'],//   [-1, '4'],// ]// Equal values return empty arrayconsole.log(diff('same','same'));// []

util.format(format[, ...args])#

History
VersionChanges
v12.11.0

The%c specifier is ignored now.

v12.0.0

Theformat argument is now only taken as such if it actually contains format specifiers.

v12.0.0

If theformat argument is not a format string, the output string's formatting is no longer dependent on the type of the first argument. This change removes previously present quotes from strings that were being output when the first argument was not a string.

v11.4.0

The%d,%f, and%i specifiers now support Symbols properly.

v11.4.0

The%o specifier'sdepth has default depth of 4 again.

v11.0.0

The%o specifier'sdepth option will now fall back to the default depth.

v10.12.0

The%d and%i specifiers now support BigInt.

v8.4.0

The%o and%O specifiers are supported now.

v0.5.3

Added in: v0.5.3

  • format<string> Aprintf-like format string.

Theutil.format() method returns a formatted string using the first argumentas aprintf-like format string which can contain zero or more formatspecifiers. Each specifier is replaced with the converted value from thecorresponding argument. Supported specifiers are:

  • %s:String will be used to convert all values exceptBigInt,Objectand-0.BigInt values will be represented with ann and Objects thathave neither a user definedtoString function norSymbol.toPrimitive function are inspected usingutil.inspect()with options{ depth: 0, colors: false, compact: 3 }.
  • %d:Number will be used to convert all values exceptBigInt andSymbol.
  • %i:parseInt(value, 10) is used for all values exceptBigInt andSymbol.
  • %f:parseFloat(value) is used for all values expectSymbol.
  • %j: JSON. Replaced with the string'[Circular]' if the argument containscircular references.
  • %o:Object. A string representation of an object with generic JavaScriptobject formatting. Similar toutil.inspect() with options{ showHidden: true, showProxy: true }. This will show the full objectincluding non-enumerable properties and proxies.
  • %O:Object. A string representation of an object with generic JavaScriptobject formatting. Similar toutil.inspect() without options. This will showthe full object not including non-enumerable properties and proxies.
  • %c:CSS. This specifier is ignored and will skip any CSS passed in.
  • %%: single percent sign ('%'). This does not consume an argument.
  • Returns:<string> The formatted string

If a specifier does not have a corresponding argument, it is not replaced:

util.format('%s:%s','foo');// Returns: 'foo:%s'

Values that are not part of the format string are formatted usingutil.inspect() if their type is notstring.

If there are more arguments passed to theutil.format() method than thenumber of specifiers, the extra arguments are concatenated to the returnedstring, separated by spaces:

util.format('%s:%s','foo','bar','baz');// Returns: 'foo:bar baz'

If the first argument does not contain a valid format specifier,util.format()returns a string that is the concatenation of all arguments separated by spaces:

util.format(1,2,3);// Returns: '1 2 3'

If only one argument is passed toutil.format(), it is returned as it iswithout any formatting:

util.format('%% %s');// Returns: '%% %s'

util.format() is a synchronous method that is intended as a debugging tool.Some input values can have a significant performance overhead that can block theevent loop. Use this function with care and never in a hot code path.

util.formatWithOptions(inspectOptions, format[, ...args])#

Added in: v10.0.0

This function is identical toutil.format(), except in that it takesaninspectOptions argument which specifies options that are passed along toutil.inspect().

util.formatWithOptions({colors:true },'See object %O', {foo:42 });// Returns 'See object { foo: 42 }', where `42` is colored as a number// when printed to a terminal.

util.getCallSites([frameCount][, options])#

History
VersionChanges
v23.7.0, v22.14.0

Propertycolumn is deprecated in favor ofcolumnNumber.

v23.7.0, v22.14.0

PropertyCallSite.scriptId is exposed.

v23.3.0, v22.12.0

The API is renamed fromutil.getCallSite toutil.getCallSites().

v22.9.0

Added in: v22.9.0

Stability: 1.1 - Active development

  • frameCount<number> Optional number of frames to capture as call site objects.Default:10. Allowable range is between 1 and 200.
  • options<Object> Optional
    • sourceMap<boolean> Reconstruct the original location in the stacktrace from the source-map.Enabled by default with the flag--enable-source-maps.
  • Returns:<Object[]> An array of call site objects
    • functionName<string> Returns the name of the function associated with this call site.
    • scriptName<string> Returns the name of the resource that contains the script for thefunction for this call site.
    • scriptId<string> Returns the unique id of the script, as in Chrome DevTools protocolRuntime.ScriptId.
    • lineNumber<number> Returns the JavaScript script line number (1-based).
    • columnNumber<number> Returns the JavaScript script column number (1-based).

Returns an array of call site objects containing the stack ofthe caller function.

import { getCallSites }from'node:util';functionexampleFunction() {const callSites =getCallSites();console.log('Call Sites:');  callSites.forEach((callSite, index) => {console.log(`CallSite${index +1}:`);console.log(`Function Name:${callSite.functionName}`);console.log(`Script Name:${callSite.scriptName}`);console.log(`Line Number:${callSite.lineNumber}`);console.log(`Column Number:${callSite.column}`);  });// CallSite 1:// Function Name: exampleFunction// Script Name: /home/example.js// Line Number: 5// Column Number: 26// CallSite 2:// Function Name: anotherFunction// Script Name: /home/example.js// Line Number: 22// Column Number: 3// ...}// A function to simulate another stack layerfunctionanotherFunction() {exampleFunction();}anotherFunction();const { getCallSites } =require('node:util');functionexampleFunction() {const callSites =getCallSites();console.log('Call Sites:');  callSites.forEach((callSite, index) => {console.log(`CallSite${index +1}:`);console.log(`Function Name:${callSite.functionName}`);console.log(`Script Name:${callSite.scriptName}`);console.log(`Line Number:${callSite.lineNumber}`);console.log(`Column Number:${callSite.column}`);  });// CallSite 1:// Function Name: exampleFunction// Script Name: /home/example.js// Line Number: 5// Column Number: 26// CallSite 2:// Function Name: anotherFunction// Script Name: /home/example.js// Line Number: 22// Column Number: 3// ...}// A function to simulate another stack layerfunctionanotherFunction() {exampleFunction();}anotherFunction();

It is possible to reconstruct the original locations by setting the optionsourceMap totrue.If the source map is not available, the original location will be the same as the current location.When the--enable-source-maps flag is enabled, for example when using--experimental-transform-types,sourceMap will be true by default.

import { getCallSites }from'node:util';interfaceFoo {foo:string;}const callSites =getCallSites({sourceMap:true });// With sourceMap:// Function Name: ''// Script Name: example.js// Line Number: 7// Column Number: 26// Without sourceMap:// Function Name: ''// Script Name: example.js// Line Number: 2// Column Number: 26
const { getCallSites } =require('node:util');const callSites =getCallSites({sourceMap:true });// With sourceMap:// Function Name: ''// Script Name: example.js// Line Number: 7// Column Number: 26// Without sourceMap:// Function Name: ''// Script Name: example.js// Line Number: 2// Column Number: 26

util.getSystemErrorName(err)#

Added in: v9.7.0

Returns the string name for a numeric error code that comes from a Node.js API.The mapping between error codes and error names is platform-dependent.SeeCommon System Errors for the names of common errors.

fs.access('file/that/does/not/exist',(err) => {const name = util.getSystemErrorName(err.errno);console.error(name);// ENOENT});

util.getSystemErrorMap()#

Added in: v16.0.0, v14.17.0

Returns a Map of all system error codes available from the Node.js API.The mapping between error codes and error names is platform-dependent.SeeCommon System Errors for the names of common errors.

fs.access('file/that/does/not/exist',(err) => {const errorMap = util.getSystemErrorMap();const name = errorMap.get(err.errno);console.error(name);// ENOENT});

util.getSystemErrorMessage(err)#

Added in: v23.1.0, v22.12.0

Returns the string message for a numeric error code that comes from a Node.jsAPI.The mapping between error codes and string messages is platform-dependent.

fs.access('file/that/does/not/exist',(err) => {const message = util.getSystemErrorMessage(err.errno);console.error(message);// No such file or directory});

util.setTraceSigInt(enable)#

Added in: v24.6.0, v22.19.0

Enable or disable printing a stack trace onSIGINT. The API is only available on the main thread.

util.inherits(constructor, superConstructor)#

History
VersionChanges
v5.0.0

Theconstructor parameter can refer to an ES6 class now.

v0.3.0

Added in: v0.3.0

Stability: 3 - Legacy: Use ES2015 class syntax andextends keyword instead.

Usage ofutil.inherits() is discouraged. Please use the ES6class andextends keywords to get language level inheritance support. Also notethat the two styles aresemantically incompatible.

Inherit the prototype methods from oneconstructor into another. Theprototype ofconstructor will be set to a new object created fromsuperConstructor.

This mainly adds some input validation on top ofObject.setPrototypeOf(constructor.prototype, superConstructor.prototype).As an additional convenience,superConstructor will be accessiblethrough theconstructor.super_ property.

const util =require('node:util');constEventEmitter =require('node:events');functionMyStream() {EventEmitter.call(this);}util.inherits(MyStream,EventEmitter);MyStream.prototype.write =function(data) {this.emit('data', data);};const stream =newMyStream();console.log(streaminstanceofEventEmitter);// trueconsole.log(MyStream.super_ ===EventEmitter);// truestream.on('data',(data) => {console.log(`Received data: "${data}"`);});stream.write('It works!');// Received data: "It works!"

ES6 example usingclass andextends:

importEventEmitterfrom'node:events';classMyStreamextendsEventEmitter {write(data) {this.emit('data', data);  }}const stream =newMyStream();stream.on('data',(data) => {console.log(`Received data: "${data}"`);});stream.write('With ES6');constEventEmitter =require('node:events');classMyStreamextendsEventEmitter {write(data) {this.emit('data', data);  }}const stream =newMyStream();stream.on('data',(data) => {console.log(`Received data: "${data}"`);});stream.write('With ES6');

util.inspect(object[, options])#

util.inspect(object[, showHidden[, depth[, colors]]])#

History
VersionChanges
v25.0.0

The util.inspect.styles.regexp style is now a method that is invoked for coloring the stringified regular expression.

v16.18.0

add support formaxArrayLength when inspectingSet andMap.

v17.3.0, v16.14.0

ThenumericSeparator option is supported now.

v13.0.0

Circular references now include a marker to the reference.

v14.6.0, v12.19.0

Ifobject is from a differentvm.Context now, a custom inspection function on it will not receive context-specific arguments anymore.

v13.13.0, v12.17.0

ThemaxStringLength option is supported now.

v13.5.0, v12.16.0

User defined prototype properties are inspected in caseshowHidden istrue.

v12.0.0

Thecompact options default is changed to3 and thebreakLength options default is changed to80.

v12.0.0

Internal properties no longer appear in the context argument of a custom inspection function.

v11.11.0

Thecompact option accepts numbers for a new output mode.

v11.7.0

ArrayBuffers now also show their binary contents.

v11.5.0

Thegetters option is supported now.

v11.4.0

Thedepth default changed back to2.

v11.0.0

Thedepth default changed to20.

v11.0.0

The inspection output is now limited to about 128 MiB. Data above that size will not be fully inspected.

v10.12.0

Thesorted option is supported now.

v10.6.0

Inspecting linked lists and similar objects is now possible up to the maximum call stack size.

v10.0.0

TheWeakMap andWeakSet entries can now be inspected as well.

v9.9.0

Thecompact option is supported now.

v6.6.0

Custom inspection functions can now returnthis.

v6.3.0

ThebreakLength option is supported now.

v6.1.0

ThemaxArrayLength option is supported now; in particular, long arrays are truncated by default.

v6.1.0

TheshowProxy option is supported now.

v0.3.0

Added in: v0.3.0

  • object<any> Any JavaScript primitive orObject.
  • options<Object>
    • showHidden<boolean> Iftrue,object's non-enumerable symbols andproperties are included in the formatted result.<WeakMap> and<WeakSet> entries are also included as well as user defined prototypeproperties (excluding method properties).Default:false.
    • depth<number> Specifies the number of times to recurse while formattingobject. This is useful for inspecting large objects. To recurse up tothe maximum call stack size passInfinity ornull.Default:2.
    • colors<boolean> Iftrue, the output is styled with ANSI colorcodes. Colors are customizable. SeeCustomizingutil.inspect colors.Default:false.
    • customInspect<boolean> Iffalse,[util.inspect.custom](depth, opts, inspect) functions are not invoked.Default:true.
    • showProxy<boolean> Iftrue,Proxy inspection includesthetarget andhandler objects.Default:false.
    • maxArrayLength<integer> Specifies the maximum number ofArray,<TypedArray>,<Map>,<WeakMap>, and<WeakSet> elements to include when formatting.Set tonull orInfinity to show all elements. Set to0 ornegative to show no elements.Default:100.
    • maxStringLength<integer> Specifies the maximum number of characters toinclude when formatting. Set tonull orInfinity to show all elements.Set to0 or negative to show no characters.Default:10000.
    • breakLength<integer> The length at which input values are split acrossmultiple lines. Set toInfinity to format the input as a single line(in combination withcompact set totrue or any number >=1).Default:80.
    • compact<boolean> |<integer> Setting this tofalse causes each object keyto be displayed on a new line. It will break on new lines in text that islonger thanbreakLength. If set to a number, the mostn inner elementsare united on a single line as long as all properties fit intobreakLength. Short array elements are also grouped together. For moreinformation, see the example below.Default:3.
    • sorted<boolean> |<Function> If set totrue or a function, all propertiesof an object, andSet andMap entries are sorted in the resultingstring. If set totrue thedefault sort is used. If set to a function,it is used as acompare function.
    • getters<boolean> |<string> If set totrue, getters are inspected. If setto'get', only getters without a corresponding setter are inspected. Ifset to'set', only getters with a corresponding setter are inspected.This might cause side effects depending on the getter function.Default:false.
    • numericSeparator<boolean> If set totrue, an underscore is used toseparate every three digits in all bigints and numbers.Default:false.
  • Returns:<string> The representation ofobject.

Theutil.inspect() method returns a string representation ofobject that isintended for debugging. The output ofutil.inspect may change at any timeand should not be depended upon programmatically. Additionaloptions may bepassed that alter the result.util.inspect() will use the constructor's name and/orSymbol.toStringTagproperty to make an identifiable tag for an inspected value.

classFoo {  get [Symbol.toStringTag]() {return'bar';  }}classBar {}const baz =Object.create(null, { [Symbol.toStringTag]: {value:'foo' } });util.inspect(newFoo());// 'Foo [bar] {}'util.inspect(newBar());// 'Bar {}'util.inspect(baz);// '[foo] {}'

Circular references point to their anchor by using a reference index:

import { inspect }from'node:util';const obj = {};obj.a = [obj];obj.b = {};obj.b.inner = obj.b;obj.b.obj = obj;console.log(inspect(obj));// <ref *1> {//   a: [ [Circular *1] ],//   b: <ref *2> { inner: [Circular *2], obj: [Circular *1] }// }const { inspect } =require('node:util');const obj = {};obj.a = [obj];obj.b = {};obj.b.inner = obj.b;obj.b.obj = obj;console.log(inspect(obj));// <ref *1> {//   a: [ [Circular *1] ],//   b: <ref *2> { inner: [Circular *2], obj: [Circular *1] }// }

The following example inspects all properties of theutil object:

import utilfrom'node:util';console.log(util.inspect(util, {showHidden:true,depth:null }));const util =require('node:util');console.log(util.inspect(util, {showHidden:true,depth:null }));

The following example highlights the effect of thecompact option:

import { inspect }from'node:util';const o = {a: [1,2, [['Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit, sed do ' +'eiusmod \ntempor incididunt ut labore et dolore magna aliqua.','test','foo']],4],b:newMap([['za',1], ['zb','test']]),};console.log(inspect(o, {compact:true,depth:5,breakLength:80 }));// { a://   [ 1,//     2,//     [ [ 'Lorem ipsum dolor sit amet,\nconsectetur [...]', // A long line//           'test',//           'foo' ] ],//     4 ],//   b: Map(2) { 'za' => 1, 'zb' => 'test' } }// Setting `compact` to false or an integer creates more reader friendly output.console.log(inspect(o, {compact:false,depth:5,breakLength:80 }));// {//   a: [//     1,//     2,//     [//       [//         'Lorem ipsum dolor sit amet,\n' +//           'consectetur adipiscing elit, sed do eiusmod \n' +//           'tempor incididunt ut labore et dolore magna aliqua.',//         'test',//         'foo'//       ]//     ],//     4//   ],//   b: Map(2) {//     'za' => 1,//     'zb' => 'test'//   }// }// Setting `breakLength` to e.g. 150 will print the "Lorem ipsum" text in a// single line.const { inspect } =require('node:util');const o = {a: [1,2, [['Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit, sed do ' +'eiusmod \ntempor incididunt ut labore et dolore magna aliqua.','test','foo']],4],b:newMap([['za',1], ['zb','test']]),};console.log(inspect(o, {compact:true,depth:5,breakLength:80 }));// { a://   [ 1,//     2,//     [ [ 'Lorem ipsum dolor sit amet,\nconsectetur [...]', // A long line//           'test',//           'foo' ] ],//     4 ],//   b: Map(2) { 'za' => 1, 'zb' => 'test' } }// Setting `compact` to false or an integer creates more reader friendly output.console.log(inspect(o, {compact:false,depth:5,breakLength:80 }));// {//   a: [//     1,//     2,//     [//       [//         'Lorem ipsum dolor sit amet,\n' +//           'consectetur adipiscing elit, sed do eiusmod \n' +//           'tempor incididunt ut labore et dolore magna aliqua.',//         'test',//         'foo'//       ]//     ],//     4//   ],//   b: Map(2) {//     'za' => 1,//     'zb' => 'test'//   }// }// Setting `breakLength` to e.g. 150 will print the "Lorem ipsum" text in a// single line.

TheshowHidden option allows<WeakMap> and<WeakSet> entries to beinspected. If there are more entries thanmaxArrayLength, there is noguarantee which entries are displayed. That means retrieving the same<WeakSet> entries twice may result in different output. Furthermore, entrieswith no remaining strong references may be garbage collected at any time.

import { inspect }from'node:util';const obj = {a:1 };const obj2 = {b:2 };const weakSet =newWeakSet([obj, obj2]);console.log(inspect(weakSet, {showHidden:true }));// WeakSet { { a: 1 }, { b: 2 } }const { inspect } =require('node:util');const obj = {a:1 };const obj2 = {b:2 };const weakSet =newWeakSet([obj, obj2]);console.log(inspect(weakSet, {showHidden:true }));// WeakSet { { a: 1 }, { b: 2 } }

Thesorted option ensures that an object's property insertion order does notimpact the result ofutil.inspect().

import { inspect }from'node:util';import assertfrom'node:assert';const o1 = {b: [2,3,1],a:'`a` comes before `b`',c:newSet([2,3,1]),};console.log(inspect(o1, {sorted:true }));// { a: '`a` comes before `b`', b: [ 2, 3, 1 ], c: Set(3) { 1, 2, 3 } }console.log(inspect(o1, {sorted:(a, b) => b.localeCompare(a) }));// { c: Set(3) { 3, 2, 1 }, b: [ 2, 3, 1 ], a: '`a` comes before `b`' }const o2 = {c:newSet([2,1,3]),a:'`a` comes before `b`',b: [2,3,1],};assert.strict.equal(inspect(o1, {sorted:true }),inspect(o2, {sorted:true }),);const { inspect } =require('node:util');const assert =require('node:assert');const o1 = {b: [2,3,1],a:'`a` comes before `b`',c:newSet([2,3,1]),};console.log(inspect(o1, {sorted:true }));// { a: '`a` comes before `b`', b: [ 2, 3, 1 ], c: Set(3) { 1, 2, 3 } }console.log(inspect(o1, {sorted:(a, b) => b.localeCompare(a) }));// { c: Set(3) { 3, 2, 1 }, b: [ 2, 3, 1 ], a: '`a` comes before `b`' }const o2 = {c:newSet([2,1,3]),a:'`a` comes before `b`',b: [2,3,1],};assert.strict.equal(inspect(o1, {sorted:true }),inspect(o2, {sorted:true }),);

ThenumericSeparator option adds an underscore every three digits to allnumbers.

import { inspect }from'node:util';const thousand =1000;const million =1000000;const bigNumber =123456789n;const bigDecimal =1234.12345;console.log(inspect(thousand, {numericSeparator:true }));// 1_000console.log(inspect(million, {numericSeparator:true }));// 1_000_000console.log(inspect(bigNumber, {numericSeparator:true }));// 123_456_789nconsole.log(inspect(bigDecimal, {numericSeparator:true }));// 1_234.123_45const { inspect } =require('node:util');const thousand =1000;const million =1000000;const bigNumber =123456789n;const bigDecimal =1234.12345;console.log(inspect(thousand, {numericSeparator:true }));// 1_000console.log(inspect(million, {numericSeparator:true }));// 1_000_000console.log(inspect(bigNumber, {numericSeparator:true }));// 123_456_789nconsole.log(inspect(bigDecimal, {numericSeparator:true }));// 1_234.123_45

util.inspect() is a synchronous method intended for debugging. Its maximumoutput length is approximately 128 MiB. Inputs that result in longer output willbe truncated.

Customizingutil.inspect colors#

Color output (if enabled) ofutil.inspect is customizable globallyvia theutil.inspect.styles andutil.inspect.colors properties.

util.inspect.styles is a map associating a style name to a color fromutil.inspect.colors.

The default styles and associated colors are:

  • bigint:yellow
  • boolean:yellow
  • date:magenta
  • module:underline
  • name: (no styling)
  • null:bold
  • number:yellow
  • regexp: A method that colors character classes, groups, assertions, andother parts for improved readability. To customize the coloring, change thecolors property. It is set to['red', 'green', 'yellow', 'cyan', 'magenta'] by default and may beadjusted as needed. The array is repetitively iterated through depending onthe "depth".
  • special:cyan (e.g.,Proxies)
  • string:green
  • symbol:green
  • undefined:grey

Color styling uses ANSI control codes that may not be supported on allterminals. To verify color support usetty.hasColors().

Predefined control codes are listed below (grouped as "Modifiers", "Foregroundcolors", and "Background colors").

Complex custom coloring#

It is possible to define a method as style. It receives the stringified valueof the input. It is invoked in case coloring is active and the type isinspected.

Example:util.inspect.styles.regexp(value)

  • value<string> The string representation of the input type.
  • Returns:<string> The adjusted representation ofobject.
Modifiers#

Modifier support varies throughout different terminals. They will mostly beignored, if not supported.

  • reset - Resets all (color) modifiers to their defaults
  • bold - Make text bold
  • italic - Make text italic
  • underline - Make text underlined
  • strikethrough - Puts a horizontal line through the center of the text(Alias:strikeThrough,crossedout,crossedOut)
  • hidden - Prints the text, but makes it invisible (Alias: conceal)
  • dim - Decreased color intensity (Alias:faint)
  • overlined - Make text overlined
  • blink - Hides and shows the text in an interval
  • inverse - Swap foreground andbackground colors (Alias:swapcolors,swapColors)
  • doubleunderline - Make textdouble underlined (Alias:doubleUnderline)
  • framed - Draw a frame around the text
Foreground colors#
  • black
  • red
  • green
  • yellow
  • blue
  • magenta
  • cyan
  • white
  • gray (alias:grey,blackBright)
  • redBright
  • greenBright
  • yellowBright
  • blueBright
  • magentaBright
  • cyanBright
  • whiteBright
Background colors#
  • bgBlack
  • bgRed
  • bgGreen
  • bgYellow
  • bgBlue
  • bgMagenta
  • bgCyan
  • bgWhite
  • bgGray (alias:bgGrey,bgBlackBright)
  • bgRedBright
  • bgGreenBright
  • bgYellowBright
  • bgBlueBright
  • bgMagentaBright
  • bgCyanBright
  • bgWhiteBright

Custom inspection functions on objects#

History
VersionChanges
v17.3.0, v16.14.0

The inspect argument is added for more interoperability.

v0.1.97

Added in: v0.1.97

Objects may also define their own[util.inspect.custom](depth, opts, inspect) function,whichutil.inspect() will invoke and use the result of when inspectingthe object.

import { inspect }from'node:util';classBox {constructor(value) {this.value = value;  }  [inspect.custom](depth, options, inspect) {if (depth <0) {return options.stylize('[Box]','special');    }const newOptions =Object.assign({}, options, {depth: options.depth ===null ?null : options.depth -1,    });// Five space padding because that's the size of "Box< ".const padding =' '.repeat(5);const inner =inspect(this.value, newOptions)                  .replace(/\n/g,`\n${padding}`);return`${options.stylize('Box','special')}<${inner} >`;  }}const box =newBox(true);console.log(inspect(box));// "Box< true >"const { inspect } =require('node:util');classBox {constructor(value) {this.value = value;  }  [inspect.custom](depth, options, inspect) {if (depth <0) {return options.stylize('[Box]','special');    }const newOptions =Object.assign({}, options, {depth: options.depth ===null ?null : options.depth -1,    });// Five space padding because that's the size of "Box< ".const padding =' '.repeat(5);const inner =inspect(this.value, newOptions)                  .replace(/\n/g,`\n${padding}`);return`${options.stylize('Box','special')}<${inner} >`;  }}const box =newBox(true);console.log(inspect(box));// "Box< true >"

Custom[util.inspect.custom](depth, opts, inspect) functions typically returna string but may return a value of any type that will be formatted accordinglybyutil.inspect().

import { inspect }from'node:util';const obj = {foo:'this will not show up in the inspect() output' };obj[inspect.custom] =(depth) => {return {bar:'baz' };};console.log(inspect(obj));// "{ bar: 'baz' }"const { inspect } =require('node:util');const obj = {foo:'this will not show up in the inspect() output' };obj[inspect.custom] =(depth) => {return {bar:'baz' };};console.log(inspect(obj));// "{ bar: 'baz' }"

util.inspect.custom#

History
VersionChanges
v10.12.0

This is now defined as a shared symbol.

v6.6.0

Added in: v6.6.0

  • Type:<symbol> that can be used to declare custom inspect functions.

In addition to being accessible throughutil.inspect.custom, thissymbol isregistered globally and can beaccessed in any environment asSymbol.for('nodejs.util.inspect.custom').

Using this allows code to be written in a portable fashion, so that the custominspect function is used in an Node.js environment and ignored in the browser.Theutil.inspect() function itself is passed as third argument to the custominspect function to allow further portability.

const customInspectSymbol =Symbol.for('nodejs.util.inspect.custom');classPassword {constructor(value) {this.value = value;  }toString() {return'xxxxxxxx';  }  [customInspectSymbol](depth, inspectOptions, inspect) {return`Password <${this.toString()}>`;  }}const password =newPassword('r0sebud');console.log(password);// Prints Password <xxxxxxxx>

SeeCustom inspection functions on Objects for more details.

util.inspect.defaultOptions#

Added in: v6.4.0

ThedefaultOptions value allows customization of the default options used byutil.inspect. This is useful for functions likeconsole.log orutil.format which implicitly call intoutil.inspect. It shall be set to anobject containing one or more validutil.inspect() options. Settingoption properties directly is also supported.

import { inspect }from'node:util';const arr =Array(156).fill(0);console.log(arr);// Logs the truncated arrayinspect.defaultOptions.maxArrayLength =null;console.log(arr);// logs the full arrayconst { inspect } =require('node:util');const arr =Array(156).fill(0);console.log(arr);// Logs the truncated arrayinspect.defaultOptions.maxArrayLength =null;console.log(arr);// logs the full array

util.isDeepStrictEqual(val1, val2[, options])#

History
VersionChanges
v24.9.0

Addedoptions parameter to allow skipping prototype comparison.

v9.0.0

Added in: v9.0.0

  • val1<any>
  • val2<any>
  • skipPrototype<boolean> Iftrue, prototype and constructorcomparison is skipped during deep strict equality check.Default:false.
  • Returns:<boolean>

Returnstrue if there is deep strict equality betweenval1 andval2.Otherwise, returnsfalse.

By default, deep strict equality includes comparison of object prototypes andconstructors. WhenskipPrototype istrue, objects withdifferent prototypes or constructors can still be considered equal if theirenumerable properties are deeply strictly equal.

const util =require('node:util');classFoo {constructor(a) {this.a = a;  }}classBar {constructor(a) {this.a = a;  }}const foo =newFoo(1);const bar =newBar(1);// Different constructors, same propertiesconsole.log(util.isDeepStrictEqual(foo, bar));// falseconsole.log(util.isDeepStrictEqual(foo, bar,true));// true

Seeassert.deepStrictEqual() for more information about deep strictequality.

Class:util.MIMEType#

History
VersionChanges
v23.11.0, v22.15.0

Marking the API stable.

v19.1.0, v18.13.0

Added in: v19.1.0, v18.13.0

An implementation ofthe MIMEType class.

In accordance with browser conventions, all properties ofMIMEType objectsare implemented as getters and setters on the class prototype, rather than asdata properties on the object itself.

A MIME string is a structured string containing multiple meaningfulcomponents. When parsed, aMIMEType object is returned containingproperties for each of these components.

new MIMEType(input)#

Creates a newMIMEType object by parsing theinput.

import {MIMEType }from'node:util';const myMIME =newMIMEType('text/plain');const {MIMEType } =require('node:util');const myMIME =newMIMEType('text/plain');

ATypeError will be thrown if theinput is not a valid MIME. Notethat an effort will be made to coerce the given values into strings. Forinstance:

import {MIMEType }from'node:util';const myMIME =newMIMEType({toString:() =>'text/plain' });console.log(String(myMIME));// Prints: text/plainconst {MIMEType } =require('node:util');const myMIME =newMIMEType({toString:() =>'text/plain' });console.log(String(myMIME));// Prints: text/plain

mime.type#

Gets and sets the type portion of the MIME.

import {MIMEType }from'node:util';const myMIME =newMIMEType('text/javascript');console.log(myMIME.type);// Prints: textmyMIME.type ='application';console.log(myMIME.type);// Prints: applicationconsole.log(String(myMIME));// Prints: application/javascriptconst {MIMEType } =require('node:util');const myMIME =newMIMEType('text/javascript');console.log(myMIME.type);// Prints: textmyMIME.type ='application';console.log(myMIME.type);// Prints: applicationconsole.log(String(myMIME));// Prints: application/javascript

mime.subtype#

Gets and sets the subtype portion of the MIME.

import {MIMEType }from'node:util';const myMIME =newMIMEType('text/ecmascript');console.log(myMIME.subtype);// Prints: ecmascriptmyMIME.subtype ='javascript';console.log(myMIME.subtype);// Prints: javascriptconsole.log(String(myMIME));// Prints: text/javascriptconst {MIMEType } =require('node:util');const myMIME =newMIMEType('text/ecmascript');console.log(myMIME.subtype);// Prints: ecmascriptmyMIME.subtype ='javascript';console.log(myMIME.subtype);// Prints: javascriptconsole.log(String(myMIME));// Prints: text/javascript

mime.essence#

Gets the essence of the MIME. This property is read only.Usemime.type ormime.subtype to alter the MIME.

import {MIMEType }from'node:util';const myMIME =newMIMEType('text/javascript;key=value');console.log(myMIME.essence);// Prints: text/javascriptmyMIME.type ='application';console.log(myMIME.essence);// Prints: application/javascriptconsole.log(String(myMIME));// Prints: application/javascript;key=valueconst {MIMEType } =require('node:util');const myMIME =newMIMEType('text/javascript;key=value');console.log(myMIME.essence);// Prints: text/javascriptmyMIME.type ='application';console.log(myMIME.essence);// Prints: application/javascriptconsole.log(String(myMIME));// Prints: application/javascript;key=value

mime.params#

Gets theMIMEParams object representing theparameters of the MIME. This property is read-only. SeeMIMEParams documentation for details.

mime.toString()#

ThetoString() method on theMIMEType object returns the serialized MIME.

Because of the need for standard compliance, this method does not allow usersto customize the serialization process of the MIME.

mime.toJSON()#

Alias formime.toString().

This method is automatically called when anMIMEType object is serializedwithJSON.stringify().

import {MIMEType }from'node:util';const myMIMES = [newMIMEType('image/png'),newMIMEType('image/gif'),];console.log(JSON.stringify(myMIMES));// Prints: ["image/png", "image/gif"]const {MIMEType } =require('node:util');const myMIMES = [newMIMEType('image/png'),newMIMEType('image/gif'),];console.log(JSON.stringify(myMIMES));// Prints: ["image/png", "image/gif"]

Class:util.MIMEParams#

Added in: v19.1.0, v18.13.0

TheMIMEParams API provides read and write access to the parameters of aMIMEType.

new MIMEParams()#

Creates a newMIMEParams object by with empty parameters

import {MIMEParams }from'node:util';const myParams =newMIMEParams();const {MIMEParams } =require('node:util');const myParams =newMIMEParams();

mimeParams.delete(name)#

Remove all name-value pairs whose name isname.

mimeParams.entries()#

Returns an iterator over each of the name-value pairs in the parameters.Each item of the iterator is a JavaScriptArray. The first item of the arrayis thename, the second item of the array is thevalue.

mimeParams.get(name)#

Returns the value of the first name-value pair whose name isname. If thereare no such pairs,null is returned.

mimeParams.has(name)#

Returnstrue if there is at least one name-value pair whose name isname.

mimeParams.keys()#

Returns an iterator over the names of each name-value pair.

import {MIMEType }from'node:util';const { params } =newMIMEType('text/plain;foo=0;bar=1');for (const nameof params.keys()) {console.log(name);}// Prints://   foo//   barconst {MIMEType } =require('node:util');const { params } =newMIMEType('text/plain;foo=0;bar=1');for (const nameof params.keys()) {console.log(name);}// Prints://   foo//   bar

mimeParams.set(name, value)#

Sets the value in theMIMEParams object associated withname tovalue. If there are any pre-existing name-value pairs whose names arename,set the first such pair's value tovalue.

import {MIMEType }from'node:util';const { params } =newMIMEType('text/plain;foo=0;bar=1');params.set('foo','def');params.set('baz','xyz');console.log(params.toString());// Prints: foo=def;bar=1;baz=xyzconst {MIMEType } =require('node:util');const { params } =newMIMEType('text/plain;foo=0;bar=1');params.set('foo','def');params.set('baz','xyz');console.log(params.toString());// Prints: foo=def;bar=1;baz=xyz

mimeParams.values()#

Returns an iterator over the values of each name-value pair.

mimeParams[Symbol.iterator]()#

Alias formimeParams.entries().

import {MIMEType }from'node:util';const { params } =newMIMEType('text/plain;foo=bar;xyz=baz');for (const [name, value]of params) {console.log(name, value);}// Prints://   foo bar//   xyz bazconst {MIMEType } =require('node:util');const { params } =newMIMEType('text/plain;foo=bar;xyz=baz');for (const [name, value]of params) {console.log(name, value);}// Prints://   foo bar//   xyz baz

util.parseArgs([config])#

History
VersionChanges
v22.4.0, v20.16.0

add support for allowing negative options in inputconfig.

v20.0.0

The API is no longer experimental.

v18.11.0, v16.19.0

Add support for default values in inputconfig.

v18.7.0, v16.17.0

add support for returning detailed parse information usingtokens in inputconfig and returned properties.

v18.3.0, v16.17.0

Added in: v18.3.0, v16.17.0

  • config<Object> Used to provide arguments for parsing and to configurethe parser.config supports the following properties:

    • args<string[]> array of argument strings.Default:process.argvwithexecPath andfilename removed.
    • options<Object> Used to describe arguments known to the parser.Keys ofoptions are the long names of options and values are an<Object> accepting the following properties:
      • type<string> Type of argument, which must be eitherboolean orstring.
      • multiple<boolean> Whether this option can be provided multipletimes. Iftrue, all values will be collected in an array. Iffalse, values for the option are last-wins.Default:false.
      • short<string> A single character alias for the option.
      • default<string> |<boolean> |<string[]> |<boolean[]> The value to assign tothe option if it does not appear in the arguments to be parsed. The valuemust match the type specified by thetype property. Ifmultiple istrue, it must be an array. No default value is applied when the optiondoes appear in the arguments to be parsed, even if the provided valueis falsy.
    • strict<boolean> Should an error be thrown when unknown argumentsare encountered, or when arguments are passed that do not match thetype configured inoptions.Default:true.
    • allowPositionals<boolean> Whether this command accepts positionalarguments.Default:false ifstrict istrue, otherwisetrue.
    • allowNegative<boolean> Iftrue, allows explicitly setting booleanoptions tofalse by prefixing the option name with--no-.Default:false.
    • tokens<boolean> Return the parsed tokens. This is useful for extendingthe built-in behavior, from adding additional checks through to reprocessingthe tokens in different ways.Default:false.
  • Returns:<Object> The parsed command line arguments:

Provides a higher level API for command-line argument parsing than interactingwithprocess.argv directly. Takes a specification for the expected argumentsand returns a structured object with the parsed options and positionals.

import { parseArgs }from'node:util';const args = ['-f','--bar','b'];const options = {foo: {type:'boolean',short:'f',  },bar: {type:'string',  },};const {  values,  positionals,} =parseArgs({ args, options });console.log(values, positionals);// Prints: [Object: null prototype] { foo: true, bar: 'b' } []const { parseArgs } =require('node:util');const args = ['-f','--bar','b'];const options = {foo: {type:'boolean',short:'f',  },bar: {type:'string',  },};const {  values,  positionals,} =parseArgs({ args, options });console.log(values, positionals);// Prints: [Object: null prototype] { foo: true, bar: 'b' } []

parseArgstokens#

Detailed parse information is available for adding custom behaviors byspecifyingtokens: true in the configuration.The returned tokens have properties describing:

  • all tokens
    • kind<string> One of 'option', 'positional', or 'option-terminator'.
    • index<number> Index of element inargs containing token. So thesource argument for a token isargs[token.index].
  • option tokens
  • positional tokens
    • value<string> The value of the positional argument in args (i.e.args[index]).
  • option-terminator token

The returned tokens are in the order encountered in the input args. Optionsthat appear more than once in args produce a token for each use. Short optiongroups like-xy expand to a token for each option. So-xxx producesthree tokens.

For example, to add support for a negated option like--no-color (whichallowNegative supports when the option is ofboolean type), the returnedtokens can be reprocessed to change the value stored for the negated option.

import { parseArgs }from'node:util';const options = {'color': {type:'boolean' },'no-color': {type:'boolean' },'logfile': {type:'string' },'no-logfile': {type:'boolean' },};const { values, tokens } =parseArgs({ options,tokens:true });// Reprocess the option tokens and overwrite the returned values.tokens  .filter((token) => token.kind ==='option')  .forEach((token) => {if (token.name.startsWith('no-')) {// Store foo:false for --no-fooconst positiveName = token.name.slice(3);      values[positiveName] =false;delete values[token.name];    }else {// Resave value so last one wins if both --foo and --no-foo.      values[token.name] = token.value ??true;    }  });const color = values.color;const logfile = values.logfile ??'default.log';console.log({ logfile, color });const { parseArgs } =require('node:util');const options = {'color': {type:'boolean' },'no-color': {type:'boolean' },'logfile': {type:'string' },'no-logfile': {type:'boolean' },};const { values, tokens } =parseArgs({ options,tokens:true });// Reprocess the option tokens and overwrite the returned values.tokens  .filter((token) => token.kind ==='option')  .forEach((token) => {if (token.name.startsWith('no-')) {// Store foo:false for --no-fooconst positiveName = token.name.slice(3);      values[positiveName] =false;delete values[token.name];    }else {// Resave value so last one wins if both --foo and --no-foo.      values[token.name] = token.value ??true;    }  });const color = values.color;const logfile = values.logfile ??'default.log';console.log({ logfile, color });

Example usage showing negated options, and when an option is usedmultiple ways then last one wins.

$node negate.js{ logfile: 'default.log', color: undefined }$node negate.js --no-logfile --no-color{ logfile: false, color: false }$node negate.js --logfile=test.log --color{ logfile: 'test.log', color: true }$node negate.js --no-logfile --logfile=test.log --color --no-color{ logfile: 'test.log', color: false }

util.parseEnv(content)#

History
VersionChanges
v24.10.0

This API is no longer experimental.

v21.7.0, v20.12.0

Added in: v21.7.0, v20.12.0

The raw contents of a.env file.

Given an example.env file:

const { parseEnv } =require('node:util');parseEnv('HELLO=world\nHELLO=oh my\n');// Returns: { HELLO: 'oh my' }import { parseEnv }from'node:util';parseEnv('HELLO=world\nHELLO=oh my\n');// Returns: { HELLO: 'oh my' }

util.promisify(original)#

History
VersionChanges
v20.8.0

Callingpromisify on a function that returns aPromise is deprecated.

v8.0.0

Added in: v8.0.0

Takes a function following the common error-first callback style, i.e. takingan(err, value) => ... callback as the last argument, and returns a versionthat returns promises.

import { promisify }from'node:util';import { stat }from'node:fs';const promisifiedStat =promisify(stat);promisifiedStat('.').then((stats) => {// Do something with `stats`}).catch((error) => {// Handle the error.});const { promisify } =require('node:util');const { stat } =require('node:fs');const promisifiedStat =promisify(stat);promisifiedStat('.').then((stats) => {// Do something with `stats`}).catch((error) => {// Handle the error.});

Or, equivalently usingasync functions:

import { promisify }from'node:util';import { stat }from'node:fs';const promisifiedStat =promisify(stat);asyncfunctioncallStat() {const stats =awaitpromisifiedStat('.');console.log(`This directory is owned by${stats.uid}`);}callStat();const { promisify } =require('node:util');const { stat } =require('node:fs');const promisifiedStat =promisify(stat);asyncfunctioncallStat() {const stats =awaitpromisifiedStat('.');console.log(`This directory is owned by${stats.uid}`);}callStat();

If there is anoriginal[util.promisify.custom] property present,promisifywill return its value, seeCustom promisified functions.

promisify() assumes thatoriginal is a function taking a callback as itsfinal argument in all cases. Iforiginal is not a function,promisify()will throw an error. Iforiginal is a function but its last argument is notan error-first callback, it will still be passed an error-firstcallback as its last argument.

Usingpromisify() on class methods or other methods that usethis may notwork as expected unless handled specially:

import { promisify }from'node:util';classFoo {constructor() {this.a =42;  }bar(callback) {callback(null,this.a);  }}const foo =newFoo();const naiveBar =promisify(foo.bar);// TypeError: Cannot read properties of undefined (reading 'a')// naiveBar().then(a => console.log(a));naiveBar.call(foo).then((a) =>console.log(a));// '42'const bindBar = naiveBar.bind(foo);bindBar().then((a) =>console.log(a));// '42'const { promisify } =require('node:util');classFoo {constructor() {this.a =42;  }bar(callback) {callback(null,this.a);  }}const foo =newFoo();const naiveBar =promisify(foo.bar);// TypeError: Cannot read properties of undefined (reading 'a')// naiveBar().then(a => console.log(a));naiveBar.call(foo).then((a) =>console.log(a));// '42'const bindBar = naiveBar.bind(foo);bindBar().then((a) =>console.log(a));// '42'

Custom promisified functions#

Using theutil.promisify.custom symbol one can override the return value ofutil.promisify():

import { promisify }from'node:util';functiondoSomething(foo, callback) {// ...}doSomething[promisify.custom] =(foo) => {returngetPromiseSomehow();};const promisified =promisify(doSomething);console.log(promisified === doSomething[promisify.custom]);// prints 'true'const { promisify } =require('node:util');functiondoSomething(foo, callback) {// ...}doSomething[promisify.custom] =(foo) => {returngetPromiseSomehow();};const promisified =promisify(doSomething);console.log(promisified === doSomething[promisify.custom]);// prints 'true'

This can be useful for cases where the original function does not follow thestandard format of taking an error-first callback as the last argument.

For example, with a function that takes in(foo, onSuccessCallback, onErrorCallback):

doSomething[util.promisify.custom] =(foo) => {returnnewPromise((resolve, reject) => {doSomething(foo, resolve, reject);  });};

Ifpromisify.custom is defined but is not a function,promisify() willthrow an error.

util.promisify.custom#

History
VersionChanges
v13.12.0, v12.16.2

This is now defined as a shared symbol.

v8.0.0

Added in: v8.0.0

In addition to being accessible throughutil.promisify.custom, thissymbol isregistered globally and can beaccessed in any environment asSymbol.for('nodejs.util.promisify.custom').

For example, with a function that takes in(foo, onSuccessCallback, onErrorCallback):

const kCustomPromisifiedSymbol =Symbol.for('nodejs.util.promisify.custom');doSomething[kCustomPromisifiedSymbol] =(foo) => {returnnewPromise((resolve, reject) => {doSomething(foo, resolve, reject);  });};

util.stripVTControlCharacters(str)#

Added in: v16.11.0

Returnsstr with any ANSI escape codes removed.

console.log(util.stripVTControlCharacters('\u001B[4mvalue\u001B[0m'));// Prints "value"

util.styleText(format, text[, options])#

History
VersionChanges
v24.2.0, v22.17.0

Added the'none' format as a non-op format.

v23.5.0, v22.13.0

styleText is now stable.

v22.8.0, v20.18.0

Respect isTTY and environment variables such as NO_COLOR, NODE_DISABLE_COLORS, and FORCE_COLOR.

v21.7.0, v20.12.0

Added in: v21.7.0, v20.12.0

  • format<string> |<Array> A text format or an Arrayof text formats defined inutil.inspect.colors.
  • text<string> The text to to be formatted.
  • options<Object>
    • validateStream<boolean> When true,stream is checked to see if it can handle colors.Default:true.
    • stream<Stream> A stream that will be validated if it can be colored.Default:process.stdout.

This function returns a formatted text considering theformat passedfor printing in a terminal. It is aware of the terminal's capabilitiesand acts according to the configuration set viaNO_COLOR,NODE_DISABLE_COLORS andFORCE_COLOR environment variables.

import { styleText }from'node:util';import { stderr }from'node:process';const successMessage =styleText('green','Success!');console.log(successMessage);const errorMessage =styleText('red','Error! Error!',// Validate if process.stderr has TTY  {stream: stderr },);console.error(errorMessage);const { styleText } =require('node:util');const { stderr } =require('node:process');const successMessage =styleText('green','Success!');console.log(successMessage);const errorMessage =styleText('red','Error! Error!',// Validate if process.stderr has TTY  {stream: stderr },);console.error(errorMessage);

util.inspect.colors also provides text formats such asitalic, andunderline and you can combine both:

console.log(  util.styleText(['underline','italic'],'My italic underlined message'),);

When passing an array of formats, the order of the format appliedis left to right so the following style might overwrite the previous one.

console.log(  util.styleText(['red','green'],'text'),// green);

The special format valuenone applies no additional styling to the text.

The full list of formats can be found inmodifiers.

Class:util.TextDecoder#

History
VersionChanges
v11.0.0

The class is now available on the global object.

v8.3.0

Added in: v8.3.0

An implementation of theWHATWG Encoding StandardTextDecoder API.

const decoder =newTextDecoder();const u8arr =newUint8Array([72,101,108,108,111]);console.log(decoder.decode(u8arr));// Hello

WHATWG supported encodings#

Per theWHATWG Encoding Standard, the encodings supported by theTextDecoder API are outlined in the tables below. For each encoding,one or more aliases may be used.

Different Node.js build configurations support different sets of encodings.(seeInternationalization)

Encodings supported by default (with full ICU data)#
EncodingAliases
'ibm866''866','cp866','csibm866'
'iso-8859-2''csisolatin2','iso-ir-101','iso8859-2','iso88592','iso_8859-2','iso_8859-2:1987','l2','latin2'
'iso-8859-3''csisolatin3','iso-ir-109','iso8859-3','iso88593','iso_8859-3','iso_8859-3:1988','l3','latin3'
'iso-8859-4''csisolatin4','iso-ir-110','iso8859-4','iso88594','iso_8859-4','iso_8859-4:1988','l4','latin4'
'iso-8859-5''csisolatincyrillic','cyrillic','iso-ir-144','iso8859-5','iso88595','iso_8859-5','iso_8859-5:1988'
'iso-8859-6''arabic','asmo-708','csiso88596e','csiso88596i','csisolatinarabic','ecma-114','iso-8859-6-e','iso-8859-6-i','iso-ir-127','iso8859-6','iso88596','iso_8859-6','iso_8859-6:1987'
'iso-8859-7''csisolatingreek','ecma-118','elot_928','greek','greek8','iso-ir-126','iso8859-7','iso88597','iso_8859-7','iso_8859-7:1987','sun_eu_greek'
'iso-8859-8''csiso88598e','csisolatinhebrew','hebrew','iso-8859-8-e','iso-ir-138','iso8859-8','iso88598','iso_8859-8','iso_8859-8:1988','visual'
'iso-8859-8-i''csiso88598i','logical'
'iso-8859-10''csisolatin6','iso-ir-157','iso8859-10','iso885910','l6','latin6'
'iso-8859-13''iso8859-13','iso885913'
'iso-8859-14''iso8859-14','iso885914'
'iso-8859-15''csisolatin9','iso8859-15','iso885915','iso_8859-15','l9'
'koi8-r''cskoi8r','koi','koi8','koi8_r'
'koi8-u''koi8-ru'
'macintosh''csmacintosh','mac','x-mac-roman'
'windows-874''dos-874','iso-8859-11','iso8859-11','iso885911','tis-620'
'windows-1250''cp1250','x-cp1250'
'windows-1251''cp1251','x-cp1251'
'windows-1252''ansi_x3.4-1968','ascii','cp1252','cp819','csisolatin1','ibm819','iso-8859-1','iso-ir-100','iso8859-1','iso88591','iso_8859-1','iso_8859-1:1987','l1','latin1','us-ascii','x-cp1252'
'windows-1253''cp1253','x-cp1253'
'windows-1254''cp1254','csisolatin5','iso-8859-9','iso-ir-148','iso8859-9','iso88599','iso_8859-9','iso_8859-9:1989','l5','latin5','x-cp1254'
'windows-1255''cp1255','x-cp1255'
'windows-1256''cp1256','x-cp1256'
'windows-1257''cp1257','x-cp1257'
'windows-1258''cp1258','x-cp1258'
'x-mac-cyrillic''x-mac-ukrainian'
'gbk''chinese','csgb2312','csiso58gb231280','gb2312','gb_2312','gb_2312-80','iso-ir-58','x-gbk'
'gb18030'
'big5''big5-hkscs','cn-big5','csbig5','x-x-big5'
'euc-jp''cseucpkdfmtjapanese','x-euc-jp'
'iso-2022-jp''csiso2022jp'
'shift_jis''csshiftjis','ms932','ms_kanji','shift-jis','sjis','windows-31j','x-sjis'
'euc-kr''cseuckr','csksc56011987','iso-ir-149','korean','ks_c_5601-1987','ks_c_5601-1989','ksc5601','ksc_5601','windows-949'
Encodings supported when Node.js is built with thesmall-icu option#
EncodingAliases
'utf-8''unicode-1-1-utf-8','utf8'
'utf-16le''utf-16'
'utf-16be'
Encodings supported when ICU is disabled#
EncodingAliases
'utf-8''unicode-1-1-utf-8','utf8'
'utf-16le''utf-16'

The'iso-8859-16' encoding listed in theWHATWG Encoding Standardis not supported.

new TextDecoder([encoding[, options]])#

  • encoding<string> Identifies theencoding that thisTextDecoder instancesupports.Default:'utf-8'.
  • options<Object>
    • fatal<boolean>true if decoding failures are fatal.This option is not supported when ICU is disabled(seeInternationalization).Default:false.
    • ignoreBOM<boolean> Whentrue, theTextDecoder will include the byteorder mark in the decoded result. Whenfalse, the byte order mark willbe removed from the output. This option is only used whenencoding is'utf-8','utf-16be', or'utf-16le'.Default:false.

Creates a newTextDecoder instance. Theencoding may specify one of thesupported encodings or an alias.

TheTextDecoder class is also available on the global object.

textDecoder.decode([input[, options]])#

Decodes theinput and returns a string. Ifoptions.stream istrue, anyincomplete byte sequences occurring at the end of theinput are bufferedinternally and emitted after the next call totextDecoder.decode().

IftextDecoder.fatal istrue, decoding errors that occur will result in aTypeError being thrown.

textDecoder.encoding#

The encoding supported by theTextDecoder instance.

textDecoder.fatal#

The value will betrue if decoding errors result in aTypeError beingthrown.

textDecoder.ignoreBOM#

The value will betrue if the decoding result will include the byte ordermark.

Class:util.TextEncoder#

History
VersionChanges
v11.0.0

The class is now available on the global object.

v8.3.0

Added in: v8.3.0

An implementation of theWHATWG Encoding StandardTextEncoder API. Allinstances ofTextEncoder only support UTF-8 encoding.

const encoder =newTextEncoder();const uint8array = encoder.encode('this is some data');

TheTextEncoder class is also available on the global object.

textEncoder.encode([input])#

UTF-8 encodes theinput string and returns aUint8Array containing theencoded bytes.

textEncoder.encodeInto(src, dest)#

Added in: v12.11.0

UTF-8 encodes thesrc string to thedest Uint8Array and returns an objectcontaining the read Unicode code units and written UTF-8 bytes.

const encoder =newTextEncoder();const src ='this is some data';const dest =newUint8Array(10);const { read, written } = encoder.encodeInto(src, dest);

textEncoder.encoding#

The encoding supported by theTextEncoder instance. Always set to'utf-8'.

util.toUSVString(string)#

Added in: v16.8.0, v14.18.0

Returns thestring after replacing any surrogate code points(or equivalently, any unpaired surrogate code units) with theUnicode "replacement character" U+FFFD.

util.transferableAbortController()#

History
VersionChanges
v23.11.0, v22.15.0

Marking the API stable.

v18.11.0

Added in: v18.11.0

Creates and returns an<AbortController> instance whose<AbortSignal> is markedas transferable and can be used withstructuredClone() orpostMessage().

util.transferableAbortSignal(signal)#

History
VersionChanges
v23.11.0, v22.15.0

Marking the API stable.

v18.11.0

Added in: v18.11.0

Marks the given<AbortSignal> as transferable so that it can be used withstructuredClone() andpostMessage().

const signal =transferableAbortSignal(AbortSignal.timeout(100));const channel =newMessageChannel();channel.port2.postMessage(signal, [signal]);

util.aborted(signal, resource)#

History
VersionChanges
v24.0.0, v22.16.0

Change stability index for this feature from Experimental to Stable.

v19.7.0, v18.16.0

Added in: v19.7.0, v18.16.0

  • signal<AbortSignal>
  • resource<Object> Any non-null object tied to the abortable operation and held weakly.Ifresource is garbage collected before thesignal aborts, the promise remains pending,allowing Node.js to stop tracking it.This helps prevent memory leaks in long-running or non-cancelable operations.
  • Returns:<Promise>

Listens to abort event on the providedsignal and returns a promise that resolves when thesignal is aborted.Ifresource is provided, it weakly references the operation's associated object,so ifresource is garbage collected before thesignal aborts,then returned promise shall remain pending.This prevents memory leaks in long-running or non-cancelable operations.

const { aborted } =require('node:util');// Obtain an object with an abortable signal, like a custom resource or operation.const dependent =obtainSomethingAbortable();// Pass `dependent` as the resource, indicating the promise should only resolve// if `dependent` is still in memory when the signal is aborted.aborted(dependent.signal, dependent).then(() => {// This code runs when `dependent` is aborted.console.log('Dependent resource was aborted.');});// Simulate an event that triggers the abort.dependent.on('event',() => {  dependent.abort();// This will cause the `aborted` promise to resolve.});import { aborted }from'node:util';// Obtain an object with an abortable signal, like a custom resource or operation.const dependent =obtainSomethingAbortable();// Pass `dependent` as the resource, indicating the promise should only resolve// if `dependent` is still in memory when the signal is aborted.aborted(dependent.signal, dependent).then(() => {// This code runs when `dependent` is aborted.console.log('Dependent resource was aborted.');});// Simulate an event that triggers the abort.dependent.on('event',() => {  dependent.abort();// This will cause the `aborted` promise to resolve.});

util.types#

History
VersionChanges
v15.3.0

Exposed asrequire('util/types').

v10.0.0

Added in: v10.0.0

util.types provides type checks for different kinds of built-in objects.Unlikeinstanceof orObject.prototype.toString.call(value), these checks donot inspect properties of the object that are accessible from JavaScript (liketheir prototype), and usually have the overhead of calling into C++.

The result generally does not make any guarantees about what kinds ofproperties or behavior a value exposes in JavaScript. They are primarilyuseful for addon developers who prefer to do type checking in JavaScript.

The API is accessible viarequire('node:util').types orrequire('node:util/types').

util.types.isAnyArrayBuffer(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<ArrayBuffer> or<SharedArrayBuffer> instance.

See alsoutil.types.isArrayBuffer() andutil.types.isSharedArrayBuffer().

util.types.isAnyArrayBuffer(newArrayBuffer());// Returns trueutil.types.isAnyArrayBuffer(newSharedArrayBuffer());// Returns true

util.types.isArrayBufferView(value)#

Added in: v10.0.0

Returnstrue if the value is an instance of one of the<ArrayBuffer>views, such as typed array objects or<DataView>. Equivalent toArrayBuffer.isView().

util.types.isArrayBufferView(newInt8Array());// trueutil.types.isArrayBufferView(Buffer.from('hello world'));// trueutil.types.isArrayBufferView(newDataView(newArrayBuffer(16)));// trueutil.types.isArrayBufferView(newArrayBuffer());// false

util.types.isArgumentsObject(value)#

Added in: v10.0.0

Returnstrue if the value is anarguments object.

functionfoo() {  util.types.isArgumentsObject(arguments);// Returns true}

util.types.isArrayBuffer(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<ArrayBuffer> instance.This doesnot include<SharedArrayBuffer> instances. Usually, it isdesirable to test for both; Seeutil.types.isAnyArrayBuffer() for that.

util.types.isArrayBuffer(newArrayBuffer());// Returns trueutil.types.isArrayBuffer(newSharedArrayBuffer());// Returns false

util.types.isAsyncFunction(value)#

Added in: v10.0.0

Returnstrue if the value is anasync function.This only reports back what the JavaScript engine is seeing;in particular, the return value may not match the original source code ifa transpilation tool was used.

util.types.isAsyncFunction(functionfoo() {});// Returns falseutil.types.isAsyncFunction(asyncfunctionfoo() {});// Returns true

util.types.isBigInt64Array(value)#

Added in: v10.0.0

Returnstrue if the value is aBigInt64Array instance.

util.types.isBigInt64Array(newBigInt64Array());// Returns trueutil.types.isBigInt64Array(newBigUint64Array());// Returns false

util.types.isBigIntObject(value)#

Added in: v10.4.0

Returnstrue if the value is a BigInt object, e.g. createdbyObject(BigInt(123)).

util.types.isBigIntObject(Object(BigInt(123)));// Returns trueutil.types.isBigIntObject(BigInt(123));// Returns falseutil.types.isBigIntObject(123);// Returns false

util.types.isBigUint64Array(value)#

Added in: v10.0.0

Returnstrue if the value is aBigUint64Array instance.

util.types.isBigUint64Array(newBigInt64Array());// Returns falseutil.types.isBigUint64Array(newBigUint64Array());// Returns true

util.types.isBooleanObject(value)#

Added in: v10.0.0

Returnstrue if the value is a boolean object, e.g. createdbynew Boolean().

util.types.isBooleanObject(false);// Returns falseutil.types.isBooleanObject(true);// Returns falseutil.types.isBooleanObject(newBoolean(false));// Returns trueutil.types.isBooleanObject(newBoolean(true));// Returns trueutil.types.isBooleanObject(Boolean(false));// Returns falseutil.types.isBooleanObject(Boolean(true));// Returns false

util.types.isBoxedPrimitive(value)#

Added in: v10.11.0

Returnstrue if the value is any boxed primitive object, e.g. createdbynew Boolean(),new String() orObject(Symbol()).

For example:

util.types.isBoxedPrimitive(false);// Returns falseutil.types.isBoxedPrimitive(newBoolean(false));// Returns trueutil.types.isBoxedPrimitive(Symbol('foo'));// Returns falseutil.types.isBoxedPrimitive(Object(Symbol('foo')));// Returns trueutil.types.isBoxedPrimitive(Object(BigInt(5)));// Returns true

util.types.isCryptoKey(value)#

Added in: v16.2.0

Returnstrue ifvalue is a<CryptoKey>,false otherwise.

util.types.isDataView(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<DataView> instance.

const ab =newArrayBuffer(20);util.types.isDataView(newDataView(ab));// Returns trueutil.types.isDataView(newFloat64Array());// Returns false

See alsoArrayBuffer.isView().

util.types.isDate(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Date> instance.

util.types.isDate(newDate());// Returns true

util.types.isExternal(value)#

Added in: v10.0.0

Returnstrue if the value is a nativeExternal value.

A nativeExternal value is a special type of object that contains araw C++ pointer (void*) for access from native code, and has no otherproperties. Such objects are created either by Node.js internals or nativeaddons. In JavaScript, they arefrozen objects with anull prototype.

#include<js_native_api.h>#include<stdlib.h>napi_value result;static napi_valueMyNapi(napi_env env, napi_callback_info info) {int* raw = (int*)malloc(1024);  napi_status status = napi_create_external(env, (void*) raw,NULL,NULL, &result);if (status != napi_ok) {    napi_throw_error(env,NULL,"napi_create_external failed");returnNULL;  }return result;}...DECLARE_NAPI_PROPERTY("myNapi", MyNapi)...
import nativefrom'napi_addon.node';import { types }from'node:util';const data = native.myNapi();types.isExternal(data);// returns truetypes.isExternal(0);// returns falsetypes.isExternal(newString('foo'));// returns falseconst native =require('napi_addon.node');const { types } =require('node:util');const data = native.myNapi();types.isExternal(data);// returns truetypes.isExternal(0);// returns falsetypes.isExternal(newString('foo'));// returns false

For further information onnapi_create_external, refer tonapi_create_external().

util.types.isFloat16Array(value)#

Added in: v24.0.0, v22.16.0

Returnstrue if the value is a built-in<Float16Array> instance.

util.types.isFloat16Array(newArrayBuffer());// Returns falseutil.types.isFloat16Array(newFloat16Array());// Returns trueutil.types.isFloat16Array(newFloat32Array());// Returns false

util.types.isFloat32Array(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Float32Array> instance.

util.types.isFloat32Array(newArrayBuffer());// Returns falseutil.types.isFloat32Array(newFloat32Array());// Returns trueutil.types.isFloat32Array(newFloat64Array());// Returns false

util.types.isFloat64Array(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Float64Array> instance.

util.types.isFloat64Array(newArrayBuffer());// Returns falseutil.types.isFloat64Array(newUint8Array());// Returns falseutil.types.isFloat64Array(newFloat64Array());// Returns true

util.types.isGeneratorFunction(value)#

Added in: v10.0.0

Returnstrue if the value is a generator function.This only reports back what the JavaScript engine is seeing;in particular, the return value may not match the original source code ifa transpilation tool was used.

util.types.isGeneratorFunction(functionfoo() {});// Returns falseutil.types.isGeneratorFunction(function*foo() {});// Returns true

util.types.isGeneratorObject(value)#

Added in: v10.0.0

Returnstrue if the value is a generator object as returned from abuilt-in generator function.This only reports back what the JavaScript engine is seeing;in particular, the return value may not match the original source code ifa transpilation tool was used.

function*foo() {}const generator =foo();util.types.isGeneratorObject(generator);// Returns true

util.types.isInt8Array(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Int8Array> instance.

util.types.isInt8Array(newArrayBuffer());// Returns falseutil.types.isInt8Array(newInt8Array());// Returns trueutil.types.isInt8Array(newFloat64Array());// Returns false

util.types.isInt16Array(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Int16Array> instance.

util.types.isInt16Array(newArrayBuffer());// Returns falseutil.types.isInt16Array(newInt16Array());// Returns trueutil.types.isInt16Array(newFloat64Array());// Returns false

util.types.isInt32Array(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Int32Array> instance.

util.types.isInt32Array(newArrayBuffer());// Returns falseutil.types.isInt32Array(newInt32Array());// Returns trueutil.types.isInt32Array(newFloat64Array());// Returns false

util.types.isKeyObject(value)#

Added in: v16.2.0

Returnstrue ifvalue is a<KeyObject>,false otherwise.

util.types.isMap(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Map> instance.

util.types.isMap(newMap());// Returns true

util.types.isMapIterator(value)#

Added in: v10.0.0

Returnstrue if the value is an iterator returned for a built-in<Map> instance.

const map =newMap();util.types.isMapIterator(map.keys());// Returns trueutil.types.isMapIterator(map.values());// Returns trueutil.types.isMapIterator(map.entries());// Returns trueutil.types.isMapIterator(map[Symbol.iterator]());// Returns true

util.types.isModuleNamespaceObject(value)#

Added in: v10.0.0

Returnstrue if the value is an instance of aModule Namespace Object.

import *as nsfrom'./a.js';util.types.isModuleNamespaceObject(ns);// Returns true

util.types.isNativeError(value)#

Added in: v10.0.0Deprecated since: v24.2.0

Stability: 0 - Deprecated: UseError.isError instead.

Note: As of Node.js v24,Error.isError() is currently slower thanutil.types.isNativeError().If performance is critical, consider benchmarking both in your environment.

Returnstrue if the value was returned by the constructor of abuilt-inError type.

console.log(util.types.isNativeError(newError()));// trueconsole.log(util.types.isNativeError(newTypeError()));// trueconsole.log(util.types.isNativeError(newRangeError()));// true

Subclasses of the native error types are also native errors:

classMyErrorextendsError {}console.log(util.types.isNativeError(newMyError()));// true

A value beinginstanceof a native error class is not equivalent toisNativeError()returningtrue for that value.isNativeError() returnstrue for errorswhich come from a differentrealm whileinstanceof Error returnsfalsefor these errors:

import { createContext, runInContext }from'node:vm';import { types }from'node:util';const context =createContext({});const myError =runInContext('new Error()', context);console.log(types.isNativeError(myError));// trueconsole.log(myErrorinstanceofError);// falseconst { createContext, runInContext } =require('node:vm');const { types } =require('node:util');const context =createContext({});const myError =runInContext('new Error()', context);console.log(types.isNativeError(myError));// trueconsole.log(myErrorinstanceofError);// false

Conversely,isNativeError() returnsfalse for all objects which were notreturned by the constructor of a native error. That includes valueswhich areinstanceof native errors:

const myError = {__proto__:Error.prototype };console.log(util.types.isNativeError(myError));// falseconsole.log(myErrorinstanceofError);// true

util.types.isNumberObject(value)#

Added in: v10.0.0

Returnstrue if the value is a number object, e.g. createdbynew Number().

util.types.isNumberObject(0);// Returns falseutil.types.isNumberObject(newNumber(0));// Returns true

util.types.isPromise(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Promise>.

util.types.isPromise(Promise.resolve(42));// Returns true

util.types.isProxy(value)#

Added in: v10.0.0

Returnstrue if the value is a<Proxy> instance.

const target = {};const proxy =newProxy(target, {});util.types.isProxy(target);// Returns falseutil.types.isProxy(proxy);// Returns true

util.types.isRegExp(value)#

Added in: v10.0.0

Returnstrue if the value is a regular expression object.

util.types.isRegExp(/abc/);// Returns trueutil.types.isRegExp(newRegExp('abc'));// Returns true

util.types.isSet(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Set> instance.

util.types.isSet(newSet());// Returns true

util.types.isSetIterator(value)#

Added in: v10.0.0

Returnstrue if the value is an iterator returned for a built-in<Set> instance.

const set =newSet();util.types.isSetIterator(set.keys());// Returns trueutil.types.isSetIterator(set.values());// Returns trueutil.types.isSetIterator(set.entries());// Returns trueutil.types.isSetIterator(set[Symbol.iterator]());// Returns true

util.types.isSharedArrayBuffer(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<SharedArrayBuffer> instance.This doesnot include<ArrayBuffer> instances. Usually, it isdesirable to test for both; Seeutil.types.isAnyArrayBuffer() for that.

util.types.isSharedArrayBuffer(newArrayBuffer());// Returns falseutil.types.isSharedArrayBuffer(newSharedArrayBuffer());// Returns true

util.types.isStringObject(value)#

Added in: v10.0.0

Returnstrue if the value is a string object, e.g. createdbynew String().

util.types.isStringObject('foo');// Returns falseutil.types.isStringObject(newString('foo'));// Returns true

util.types.isSymbolObject(value)#

Added in: v10.0.0

Returnstrue if the value is a symbol object, createdby callingObject() on aSymbol primitive.

const symbol =Symbol('foo');util.types.isSymbolObject(symbol);// Returns falseutil.types.isSymbolObject(Object(symbol));// Returns true

util.types.isTypedArray(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<TypedArray> instance.

util.types.isTypedArray(newArrayBuffer());// Returns falseutil.types.isTypedArray(newUint8Array());// Returns trueutil.types.isTypedArray(newFloat64Array());// Returns true

See alsoArrayBuffer.isView().

util.types.isUint8Array(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Uint8Array> instance.

util.types.isUint8Array(newArrayBuffer());// Returns falseutil.types.isUint8Array(newUint8Array());// Returns trueutil.types.isUint8Array(newFloat64Array());// Returns false

util.types.isUint8ClampedArray(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Uint8ClampedArray> instance.

util.types.isUint8ClampedArray(newArrayBuffer());// Returns falseutil.types.isUint8ClampedArray(newUint8ClampedArray());// Returns trueutil.types.isUint8ClampedArray(newFloat64Array());// Returns false

util.types.isUint16Array(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Uint16Array> instance.

util.types.isUint16Array(newArrayBuffer());// Returns falseutil.types.isUint16Array(newUint16Array());// Returns trueutil.types.isUint16Array(newFloat64Array());// Returns false

util.types.isUint32Array(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<Uint32Array> instance.

util.types.isUint32Array(newArrayBuffer());// Returns falseutil.types.isUint32Array(newUint32Array());// Returns trueutil.types.isUint32Array(newFloat64Array());// Returns false

util.types.isWeakMap(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<WeakMap> instance.

util.types.isWeakMap(newWeakMap());// Returns true

util.types.isWeakSet(value)#

Added in: v10.0.0

Returnstrue if the value is a built-in<WeakSet> instance.

util.types.isWeakSet(newWeakSet());// Returns true

Deprecated APIs#

The following APIs are deprecated and should no longer be used. Existingapplications and modules should be updated to find alternative approaches.

util._extend(target, source)#

Added in: v0.7.5Deprecated since: v6.0.0

Stability: 0 - Deprecated: UseObject.assign() instead.

Theutil._extend() method was never intended to be used outside of internalNode.js modules. The community found and used it anyway.

It is deprecated and should not be used in new code. JavaScript comes with verysimilar built-in functionality throughObject.assign().

util.isArray(object)#

Added in: v0.6.0Deprecated since: v4.0.0

Stability: 0 - Deprecated: UseArray.isArray() instead.

Alias forArray.isArray().

Returnstrue if the givenobject is anArray. Otherwise, returnsfalse.

const util =require('node:util');util.isArray([]);// Returns: trueutil.isArray(newArray());// Returns: trueutil.isArray({});// Returns: false