Skip to content

Commit 3eac60e

Browse files
committed
src,lib: introduce util.getSystemErrorMessage(err)
This patch adds a new utility function which provides human-readable string description of the given system error code. Signed-off-by: Juan José Arboleda <[email protected]>
1 parent 20aff2b commit 3eac60e

File tree

5 files changed

+56
-2
lines changed

5 files changed

+56
-2
lines changed

doc/api/util.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,26 @@ fs.access('file/that/does/not/exist', (err) => {
406406
});
407407
```
408408

409+
## `util.getSystemErrorMessage(err)`
410+
411+
<!-- YAML
412+
added: REPLACEME
413+
-->
414+
415+
* `err` {number}
416+
* Returns: {string}
417+
418+
Returns the string message for a numeric error code that comes from a Node.js
419+
API.
420+
The mapping between error codes and string messages is platform-dependent.
421+
422+
```js
423+
fs.access('file/that/does/not/exist', (err) => {
424+
const name = util.getSystemErrorMessage(err.errno);
425+
console.error(name); // no such file or directory
426+
});
427+
```
428+
409429
## `util.inherits(constructor, superConstructor)`
410430

411431
<!-- YAML

lib/internal/util.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,10 @@ function getCWDURL() {
381381
return cachedURL;
382382
}
383383

384+
function getSystemErrorMessage(err) {
385+
return lazyUv().getErrorMessage(err);
386+
}
387+
384388
function getSystemErrorName(err) {
385389
const entry = uvErrmapGet(err);
386390
return entry ? entry[0] : `Unknown system error ${err}`;
@@ -916,6 +920,7 @@ module.exports = {
916920
getStructuredStack,
917921
getSystemErrorMap,
918922
getSystemErrorName,
923+
getSystemErrorMessage,
919924
guessHandleType,
920925
isArrayBufferDetached,
921926
isError,

lib/util.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ const {
6868
deprecate,
6969
getSystemErrorMap,
7070
getSystemErrorName: internalErrorName,
71+
getSystemErrorMessage: internalErrorMessage,
7172
promisify,
7273
defineLazyProperties,
7374
} = require('internal/util');
@@ -229,6 +230,18 @@ function callbackify(original) {
229230
return callbackified;
230231
}
231232

233+
/**
234+
* @param {number} err
235+
* @returns {string}
236+
*/
237+
function getSystemErrorMessage(err) {
238+
validateNumber(err, 'err');
239+
if (err >= 0 || !NumberIsSafeInteger(err)) {
240+
throw new ERR_OUT_OF_RANGE('err', 'a negative integer', err);
241+
}
242+
return internalErrorMessage(err);
243+
}
244+
232245
/**
233246
* @param {number} err
234247
* @returns {string}
@@ -291,6 +304,7 @@ module.exports = {
291304
formatWithOptions,
292305
getSystemErrorMap,
293306
getSystemErrorName,
307+
getSystemErrorMessage,
294308
inherits,
295309
inspect,
296310
isArray: deprecate(ArrayIsArray,

src/uv.cc

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ using v8::ReadOnly;
5959
using v8::String;
6060
using v8::Value;
6161

62+
void GetErrMessage(const FunctionCallbackInfo<Value>& args) {
63+
Environment* env = Environment::GetCurrent(args);
64+
int err = args[0].As<v8::Int32>()->Value();
65+
CHECK_LT(err, 0);
66+
char message[50];
67+
uv_strerror_r(err, message, sizeof(message));
68+
args.GetReturnValue().Set(OneByteString(env->isolate(), message));
69+
}
70+
6271
void ErrName(const FunctionCallbackInfo<Value>& args) {
6372
Environment* env = Environment::GetCurrent(args);
6473
if (env->options()->pending_deprecation && env->EmitErrNameWarning()) {
@@ -70,8 +79,7 @@ void ErrName(const FunctionCallbackInfo<Value>& args) {
7079
"DEP0119").IsNothing())
7180
return;
7281
}
73-
int err;
74-
if (!args[0]->Int32Value(env->context()).To(&err)) return;
82+
int err = args[0].As<v8::Int32>()->Value();
7583
CHECK_LT(err, 0);
7684
char name[50];
7785
uv_err_name_r(err, name, sizeof(name));
@@ -128,11 +136,13 @@ void Initialize(Local<Object> target,
128136
}
129137

130138
SetMethod(context, target, "getErrorMap", GetErrMap);
139+
SetMethod(context, target, "getErrorMessage", GetErrMessage);
131140
}
132141

133142
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
134143
registry->Register(ErrName);
135144
registry->Register(GetErrMap);
145+
registry->Register(GetErrMessage);
136146
}
137147
} // namespace uv
138148
} // namespace node

test/parallel/test-uv-errno.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const common = require('../common');
55
const assert = require('assert');
66
const {
77
getSystemErrorName,
8+
getSystemErrorMessage,
89
_errnoException
910
} = require('util');
1011

@@ -13,6 +14,7 @@ const uv = internalBinding('uv');
1314
const keys = Object.keys(uv);
1415

1516
assert.strictEqual(uv.errname(-111111), 'Unknown system error -111111');
17+
assert.strictEqual(uv.getErrorMessage(-111111), 'Unknown system error -111111');
1618

1719
keys.forEach((key) => {
1820
if (!key.startsWith('UV_'))
@@ -21,6 +23,8 @@ keys.forEach((key) => {
2123
const err = _errnoException(uv[key], 'test');
2224
const name = uv.errname(uv[key]);
2325
assert.strictEqual(getSystemErrorName(uv[key]), name);
26+
assert.notStrictEqual(getSystemErrorMessage(uv[key]),
27+
`Unknown system error ${key}`);
2428
assert.strictEqual(err.code, name);
2529
assert.strictEqual(err.code, getSystemErrorName(err.errno));
2630
assert.strictEqual(err.message, `test ${name}`);
@@ -53,3 +57,4 @@ function runTest(fn) {
5357

5458
runTest(_errnoException);
5559
runTest(getSystemErrorName);
60+
runTest(getSystemErrorMessage);

0 commit comments

Comments
 (0)