+-
我如何从Node.js错误中访问错误代码?

我正在使用uncaughtExceptionprocess事件来检测错误。提供的错误对象不具有code属性,但是Node.js documentation表示codeError类的属性。 uncaughtException提供的错误对象是否与Error类不同?

0
投票

取决于所捕获的错误,即,并非所有错误实际上都设置了code属性。考虑以下两个简单示例:

// example 1
const express = require('express')
const app = express();
const port = 3000;

process.on('uncaughtException', (error) => {
    console.log(error)
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

如果其他端口已经在监听3000端口,则会在控制台上显示以下错误信息:

Error: listen EADDRINUSE: address already in use :::3000
    at Server.setupListenHandle [as _listen2] (net.js:1298:14)
    at listenInCluster (net.js:1346:12)
    at Server.listen (net.js:1434:7)
    ...
    at Module.load (internal/modules/cjs/loader.js:790:32)
    at Function.Module._load (internal/modules/cjs/loader.js:703:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:999:10) {
  code: 'EADDRINUSE',
  errno: 'EADDRINUSE',
  syscall: 'listen',
  address: '::',
  port: 3000
}

如您所见,system error EADDRINUSE设置了代码属性。

另一方面,此>

// example 2
process.on('uncaughtException', (error) => {
    console.log(error)
});

someFunc();

将打印:

ReferenceError: someFunc is not defined
    ...
    at Module._compile (internal/modules/cjs/loader.js:936:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:947:10)
    at Module.load (internal/modules/cjs/loader.js:790:32)
    at Function.Module._load (internal/modules/cjs/loader.js:703:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:999:10)
    at internal/main/run_main_module.js:17:11

如您所见,ReferenceError没有设置代码属性。