node是单线程,某一个任务的后续操作,往往采用回调函数(callback)的形式进行定义。Node约定,如果某个函数需要回调函数作为参数,则回调函数是最后一个参数。另外,回调函数本身的第一个参数,约定为上一步传入的错误对象。如果没有发生错误,回调函数的第一个参数就传入null。
全局对象和全局变量
- 全局对象:global,process(node所属当前进程),console
- 全局函数:setTimeout(),clearTimeout(),setInterval(),clearInterval(),require(用于加载模块),Buffer(用于操作二进制数据)
- 全局变量:__filename(当前运行的脚本文件名),__dirname(当前运行的脚本所在的目录)
- 伪全局变量(模块内部):module, module.exports, exports
模块化结构
模块即文件
- 加载模块:require("moudle")
- 输出模块:module.exports
- 核心模块:http,url,fs,querystring,child_process,util,path,crypto
异常处理
Node是单线程运行环境,一旦抛出的异常没有被捕获,就会引起整个进程的崩溃。所以,Node的异常处理对于保证系统的稳定运行非常重要。
- 使用throw语句抛出一个错误对象,即抛出异常。
try…catch结构,但是,这个结构无法捕获异步运行的代码抛出的异常。因为异步操作会在下一轮事件循环中抛出异常,但是此时catch语句已经运行结束。解决方案:用setTimeout,将错误捕获放在异步操作中。- 回调函数
Node采用的方法,是将错误对象作为第一个参数,传入回调函数。这样就避免了捕获代码与发生错误的代码不在同一个时间段的问题。- EventEmitter接口的error事件
如果没有对error事件部署监听函数,会导致整个应用程序崩溃。
其他异常处理方法
- uncaughtException事件
只要给uncaughtException配置了回调,Node进程不会异常退出,但异常发生的上下文已经丢失,无法给出异常发生的详细信息。而且,异常可能导致Node不能正常进行内存回收,出现内存泄露。所以,当uncaughtException触发后,最好记录错误日志,然后结束Node进程。- unhandledRejection事件
iojs有一个unhandledRejection事件,用来监听没有捕获的Promise对象的rejected状态。
process.on('unhandledRejection', function (err, p) {
console.error(err.stack);
})