在浏览器中全局对象是window,在Node.js中全局对象是global。
所有全局变量都是全局对象的属性。
__filename
__filename 表示当前正在执行的脚本的文件名,它将输出文件所在位置的绝对路径。1
2// app.js
console.log(__filename);
1 | E:\hexo>node app.js |
__dirname
__dirname 表示当前执行脚本所在的目录。1
2// app.js
console.log(__dirname);
1 | E:\hexo>node app.js |
process 进程
用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口。
process事件
beforeExit事件
当 Node.js 的事件循环数组已经为空,并且没有额外的工作被添加进来,事件 ‘beforeExit’ 会被触发。
disconnect事件
当 IPC 通道关闭时,会触发’disconnect’事件。
exit事件
当进程准备退出时触发。
两种情况下 ‘exit’ 事件会被触发:
- 显式调用 process.exit() 方法,使得 Node.js 进程即将结束;
- Node.js 事件循环数组中不再有额外的工作,使得 Node.js 进程即将结束。
exit事件监听器的回调函数,只允许包含同步操作。所有监听器的回调函数被调用后,任何在事件循环数组中排队的工作都会被强制丢弃,然后 Nodje.js 进程会立即结束。1
2
3
4
5
6process.on('exit', (code) => {
setTimeout(() => {
console.log('该函数不会被执行');
}, 0);
console.log(`即将退出,退出码:${code}`);
});
message事件
当子进程收到父进程发送的消息时(消息通过 childprocess.send() 发送),会触发 ‘message’ 事件。
rejectionHandled事件
如果有 Promise 被 rejected,并且此 Promise在 Node.js 事件循环的下次轮询及之后期间,被绑定了一个错误处理器(例如使用 promise.catch()),会触发 ‘rejectionHandled’ 事件。
uncaughtException事件
如果Javascript有未捕获的异常,沿着代码调用路径反向传递回事件循环,会触发 ‘uncaughtException’ 事件。
Node.js 默认情况下会将这些异常堆栈打印到 stderr 然后进程退出。 为 ‘uncaughtException’ 事件增加监听器会覆盖上述默认行为。1
2
3
4
5
6
7
8
9
10
11process.on('uncaughtException', (err) => {
fs.writeSync(1, `捕获到异常:${err}\n`);
});
setTimeout(() => {
console.log('这里仍然会运行。');
}, 500);
// 故意调用一个不存在的函数,应用会抛出未捕获的异常。
nonexistentFunc();
console.log('这里不会运行。');
正确使用uncaughtException事件的方式,是用它在进程结束前执行一些已分配资源(比如文件描述符,句柄等等)的同步清理操作。 触发uncaughtException事件后,用它来尝试恢复应用正常运行的操作是不安全的。
想让一个已经崩溃的应用正常运行,更可靠的方式应该是启动另外一个进程来监测/探测应用是否出错, 无论uncaughtException事件是否被触发,如果监测到应用出错,则恢复或重启应用。
Signal事件
当Node.js进程接收到一个信号时,会触发信号事件。例如SIGINT, SIGHUP等。
process.abort()
process.abort()方法会使Node.js进程立即结束,并生成一个core文件。
process.arch
process.arch属性返回一个表示操作系统CPU架构的字符串,Node.js二进制文件是为这些架构编译的。
例如:’arm’, ‘arm64’, ‘ia32’, ‘mips’, ‘mipsel’, ‘ppc’, ‘ppc64’, ‘s390’, ‘s390x’, ‘x32’, 或 ‘x64’。
process.argv
process.argv返回一个数组,里面包含了启动Node.js进程时的命令行参数。1
console.log(process.argv)
1 | E:\hexo>node app.js -p 80 12=333 |
process.channel
process.channel属性保存IPC channel的引用。 如果IPC channel不存在,此属性值为undefined。
process.chdir(directory)
process.chdir()方法变更Node.js进程的当前工作目录,如果变更目录失败会抛出异常(例如,如果指定的目录不存在)。1
2
3
4
5
6
7console.log(`Starting directory: ${process.cwd()}`);
try {
process.chdir('/tmp');
console.log(`New directory: ${process.cwd()}`);
} catch (err) {
console.error(`chdir: ${err}`);
}
process.config
process.config 属性返回一个Javascript对象。此对象描述了用于编译当前Node.js执行程序时涉及的配置项信息。 这与执行./configure脚本生成的config.gypi文件结果是一样的。
process.connected
只要IPC channel保持连接,process.connected属性就会返回true。 process.disconnect()被调用后,此属性会返回false。
process.cpuUsage()
process.cpuUsage()方法返回包含当前进程的用户CPU时间和系统CPU时间的对象。
此对象包含user和system属性,属性值的单位都是微秒(百万分之一秒)。 user和system属性值分别计算了执行用户程序和系统程序的时间。
process.cwd()
process cwd() 方法返回 Node.js 进程当前工作的目录。
process.disconnect()
process.disconnect()函数会关闭到父进程的IPC频道,以允许子进程一旦没有其他链接来保持活跃就优雅地关闭。
调用process.disconnect()的效果和父进程调用ChildProcess.disconnect()的一样。
process.emitWarning(warning[, options])
process.emitWarning()方法可用于发出定制的或应用特定的进程警告。
process.env
process.env属性返回一个包含用户环境信息的对象。
process.execArgv
process.execArgv 属性返回当Node.js进程被启动时,Node.js特定的命令行选项。
process.execPath
process.execPath 属性,返回启动Node.js进程的可执行文件所在的绝对路径。
process.exit([code])
process.exit()方法以结束状态码code指示Node.js同步终止进程。
process.exitCode
当进程正常结束,或通过process.exit()结束但未传递参数时,此数值标识进程结束的状态码。
给process.exit(code)指定一个状态码,会覆盖process.exitCode的原有值。
process.getegid()
process.getegid()方法返回Node.js进程的有效数字标记的组身份。
PS:这个函数只在POSIX平台有效(在Windows或Android平台无效)。
process.geteuid()
process.geteuid()方法返回Node.js进程的有效数字标记的用户身份。
PS:这个函数只在POSIX平台有效(在Windows或Android平台无效)。
process.getgid()
process.getgid()方法返回Node.js进程的数字标记的组身份。
PS:这个函数只在POSIX平台有效(在Windows或Android平台无效)。
process.getgroups()
process.getgroups()方法返回数组,其中包含了补充的组ID。 如果包含有效的组ID,POSIX会将其保留为未指定状态,但 Node.js 会确保它始终处于状态。
PS:这个函数只在POSIX平台有效(在Windows或Android平台无效)。
process.getuid()
process.getuid()方法返回Node.js进程的数字标记的用户身份。
PS:这个函数只在POSIX平台有效(在Windows或Android平台无效)。
process.kill(pid[, signal])
signal
process.kill()方法将signal发送给pid标识的进程。
信号名称是如’SIGINT’ 或 ‘SIGHUP’的字符串。
process.mainModule
process.mainModule属性提供了一种获取require.main的替代方式。
区别在于,若主模块在运行时中发生改变, require.main可能仍然指向变化之前所依赖的模块 一般来说,假定require.main和process.mainModule引用相同的模块是安全的。
process.memoryUsage()
process.memoryUsage()方法返回Node.js进程的内存使用情况的对象,该对象每个属性值的单位为字节。
process.nextTick(callback[, …args])
process.nextTick()方法将 callback 添加到”next tick 队列”。 一旦当前事件轮询队列的任务全部完成,在next tick队列中的所有callbacks会被依次调用。
这种方式不是setTimeout(fn, 0)的别名。它更加有效率。事件轮询随后的ticks 调用,会在任何I/O事件(包括定时器)之前运行。
process.pid
process.pid属性返回进程的PID。
process.platform
process.platform属性返回字符串,标识Node.js进程运行其上的操作系统平台。
process.ppid
process.ppid 属性返回当前父进程的进程ID。
process.release
process.release 属性返回与当前发布相关的元数据对象,包括源代码和源代码头文件 tarball的URLs。
process.send(message[, sendHandle[, options]][, callback])
如果Node.js进程是通过进程间通信产生的,那么,process.send()方法可以用来给父进程发送消息。 接收到的消息被视为父进程的ChildProcess对象上的一个’message’事件。
process.setegid(id)
id
process.setegid()方法为进程设置有效的用户组ID。(请看 setegid(2).) id可以传一个数值ID或传一个用户组名称字符串。如果传了后者的话,会解析成一个相关的数值ID, 解析的时候,这个方法方法是阻塞的。
PS: 这个方法只在POSIX平台可用(换句话说,Windows或Android不行)。
process.seteuid(id)
id
process.seteuid()方法为进程设置有效的用户ID。(请看 seteuid(2).) id可以传一个数值ID或传一个用户名字符串。如果传了特定的用户名字符串,会解析成一个相关的数值ID, 解析的时候,这个方法方法是阻塞的。
PS: 这个方法只在POSIX平台可用(换句话说,Windows或Android不行)。
process.setgid(id)
id
process.setgid() 为进程方法设置组ID. (查看setgid(2).) 可给id参数传一个数值ID或字符串名。
如果已经有一个进程组ID名,那么在解析为相关的ID之前,此方法是阻塞。
PS: 这个方法只在POSIX平台可用(换句话说,Windows或Android不行)。
process.setuid(id)
process.setuid(id) 设置进程的用户ID (参见 setuid(2).) id 可以是一个数值ID也可以是一个用户名字符串. 如果已经有一个用户名,在解析为相关的数值ID时,此方法阻塞。
process.stderr
process.stderr 属性返回连接到stderr(fd 2)的流。 它是一个net.Socket(它是一个Duplex流),除非 fd 2指向一个文件,在这种情况下它是一个可写流。
process.stdin
process.stdin 属性返回连接到 stdin (fd 0)的流。 它是一个net.Socket(它是一个Duplex流),除非 fd 0指向一个文件,在这种情况下它是一个Readable流。1
2
3
4
5
6
7
8
9
10
11process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
const chunk = process.stdin.read();
if (chunk !== null) {
process.stdout.write(`data: ${chunk}`);
}
});
process.stdin.on('end', () => {
process.stdout.write('end');
});
process.stdin 返回的 Duplex 流, 可以在旧模式下使用,兼容node v0.10。 更多信息查看流的兼容性。
process.stdout
process.stdout 属性返回连接到 stdout (fd 1)的流。 它是一个net.Socket (它是一个Duplex流), 除非 fd 1 指向一个文件,在这种情况下它是一个可写流。
process.title
process.title 属性用于获取或设置当前进程在 ps 命令中显示的进程名字。
process.umask([mask])
process.umask()方法用于返回或设置Node.js进程的默认创建文件的权限掩码。
process.uptime()
process.uptime() 方法返回当前 Node.js 进程运行时间秒长。
process.version
process.version 属性返回Node.js的版本信息。
process.versions
process.versions属性返回一个对象,此对象列出了Node.js和其依赖的版本信息。
Exit Codes
- 1 未捕获异常 - 有一个未被捕获的异常, 并且没被一个 domain 或 an ‘uncaughtException’ 事件处理器处理。
- 2 - 未被使用 (Bash为防内部滥用而保留)
- 3 内部JavaScript 分析错误 - Node.js的内部的JavaScript源代码 在引导进程中导致了一个语法分析错误。 这是非常少见的, 一般只会在开发Node.js本身的时候出现。
- 4 内部JavaScript执行失败 - 引导进程执行Node.js的内部的JavaScript源代码时,返回函数值失败。 这是非常少见的, 一般只会在开发Node.js本身的时候出现。
- 5 致命错误 - 在V8中有一个致命的错误. 比较典型的是以FATALERROR为前缀从stderr打印出来的消息。
- 6 非函数的内部异常处理 - 发生了一个内部异常,但是内部异常处理函数 被设置成了一个非函数,或者不能被调用。
- 7 内部异常处理运行时失败 - 有一个不能被捕获的异常。 在试图处理这个异常时,处理函数本身抛出了一个错误。 这是可能发生的, 比如, 如果一个 ‘uncaughtException’ 或者 domain.on(‘error’) 处理函数抛出了一个错误。
- 8 - 未被使用. 在之前版本的Node.js, 退出码8有时候表示一个未被捕获的异常。
- 9 - 不可用参数 - 也许是某个未知选项没有确定,或者没给必需要的选项填值。
- 10 内部JavaScript运行时失败 - 调用引导函数时, 引导进程执行Node.js的内部的JavaScript源代码抛出错误。 这是非常少见的, 一般只会在开发Node.js本身的时候出现。
- 12 不可用的调试参数 - –inspect 和/或 –inspect-brk 选项已设置,但选择的端口号无效或不可用。
- 128 退出信号 - 如果Node.js的接收信号致命诸如 SIGKILL 或 SIGHUP,那么它的退出代码将是 128 加上信号的码值。 这是POSIX的标准做法,因为退出码被定义为7位整数,并且信号退出设置高位,然后包含信号码值。
console
console 用于提供控制台标准输出。
Node.js 提供了与chrome浏览器行为一致的 console 对象,用于向标准输出流(stdout)或标准错误流(stderr)输出字符。
Console.assert()
判断第一个参数是否为真,false的话抛出异常并且在控制台输出相应信息。
Console.clear()
清空控制台。
console.count([label])
label
维护一个指定 label 的内部计数器并且输出到 stdout 指定 label 调用 console.count() 的次数。1
2
3
4
5
6
7
8
9
10
11var user = "";
function greet() {
console.count();
return "hi " + user;
}
user = "bob";
greet();
user = "alice";
greet();
greet();
console.count();
Console 的输出如下:1
2
3
4"<no label>: 1"
"<no label>: 2"
"<no label>: 3"
"<no label>: 1"
console.countReset()
label
重置指定 label 的内部计数器。
console.error()
打印一条错误信息。
console.group([…label])
打印树状结构,配合groupCollapsed以及groupEnd方法;
console.groupCollapsed()
创建一个新的内联 group。使用方法和group相同,不同的是groupCollapsed打印出来的内容默认是折叠的。
console.groupEnd()
结束当前Tree
console.info()
打印以感叹号字符开始的信息,使用方法和log相同
console.log()
打印字符串,使用方法比较类似C的printf格式输出。
console.table()
将列表型的数据打印成表格。
console.time(label)
启动一个定时器,用以计算一个操作的持续时间。 定时器由一个唯一的 label 标识。
当调用 console.timeEnd() 时,可以使用相同的 label 来停止定时器,并以毫秒为单位将持续时间输出到 stdout。 定时器持续时间精确到亚毫秒。
console.timeEnd(label)
接受一个参数作为标识,结束特定的计时器。1
2
3
4console.time('100-elements');
for (let i = 0; i < 100; i++) {}
console.timeEnd('100-elements');
// 打印 100-elements: 225.438ms
console.trace()
打印字符串 ‘Trace :’ 到 stderr ,并通过 util.format() 格式化消息与堆栈跟踪在代码中的当前位置。
console.warn()
打印一个警告信息,可以使用 string substitution 和额外的参数。