NodeJs I/O 键盘交互
操作系统对I/O的操作分为阻塞I/O和非阻塞I/O。阻塞I/O造成了CPU的等待,使CPU不能得到充分的利用;而非阻塞I/O虽然不必等待完整I/O的返回,但需要通过轮询重复的调用判断操作,这种判断操作也是对CPU的一种浪费。我们希望非阻塞I/O可以免去轮询的步骤,在实际I/O操作完成后,通过返回完成信号通知应用程序即可。
Node使用了观察者模式和事件循环机制来实现这种异步I/O。这里以去餐厅消费为例,异步调用相当于去餐厅就餐的顾客,顾客将菜单交给服务员,即Node的I/O观察者,厨房即Node的事件循环机制询问服务员是否还有要做的菜,服务员将顾客的菜单交给厨房处理。
阻塞代码实例
创建一个文件 input.txt ,内容如下:
极客坊官网地址:www.geekf.org
创建 main.js 文件, 代码如下:
var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("程序执行结束!");
以上代码执行结果如下:
$ node main.js
极客坊官网地址:www.geekf.org
程序执行结束!
非阻塞代码实例
创建一个文件 input.txt ,内容如下:
极客坊官网地址:www.geekf.org
创建 main.js 文件, 代码如下:
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!");
以上代码执行结果如下:
$ node main.js
程序执行结束!
极客坊官网地址:www.geekf.org
以上两个实例我们了解了阻塞与非阻塞调用的不同。第一个实例在文件读取完后才执行完程序。 第二个实例我们呢不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。
因此,阻塞按是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内。
Node.js URL 请求(路由)
我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码。
因此,我们需要查看HTTP请求,从中提取出请求的URL以及GET/POST参数。这一功能应当属于路由还是服务器(甚至作为一个模块自身的功能)确实值得探讨,但这里暂定其为我们的HTTP服务器的功能。
我们需要的所有数据都会包含在request对象中,该对象作为onRequest()回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的Node.JS模块,它们分别是url和querystring模块。