Nodejs.1

参考内容:
Node.js REPL(交互式解释器)
C/C++之回调函数
注意 - 在nodejs网页中使用中文时需要保证两点

  • .js文件以UTF8格式保存;
  • 在HTML Head中需要设置charset=utf-8,如使用
    response.writeHead(200, {'Content-Type':'text/html;charset=utf-8'}); 进行设置。

一、Node.js REPL(交互式解释器)

Node的交互式解释器可以很好地调试Javascript代码

  1. 启动Node终端
$ node
>
  • 简单表达式运算
$ node
> 1+4
5
> 5/2
2.5
> 3*6
18
> 4-1
3
> 1+(2*3)-4
3
>
  • 使用变量
    变量声明使用var关键字,如果没有使用var关键字,变量会直接打印出来;使用var关键字的变量,可以使用console.log()输出。
$ node
> x = 10
10
> var y = 10
undefined
> x + y
20
> console.log("Hello World")
Hello World
undefined
> console.log(y)
10
undefined
>
  • 多行表达式
    类似JavaScript,执行一个do-while循环。...系统自动生成,Node自动检测是否为连续表达式。
$ node
> var x = 0
undefined
> do {
... x ++;
... console.log("x: " + x);
... } while (x < 5);
x: 1
x: 2
x: 3
x: 4
x: 5
undefined
>
  • 下划线(_)变量
    可以使用下划线获取表达式的运算结果。
$ node
> var x = 10
undefined
> var y = 20
undefined
> x + y
30
> var sum = _
undefined
> console.log(sum)
30
undefined
>
REPL命令
ctrl + c  #退出当前终端
ctrl + c按下两次  #退出Node REPL
ctrl + d  #退出Node REPL
向上/向下 键  #查看输入的历史命令
tab 键  #列出当前命令
.help  #列出使用命令
.break  #退出多行表达式
.clear  #退出多行表达式
.save filename  #保存当前的Node REPL会话到指定文件
.load filename  #载入当前Node REPL会话的文件内容

二、Node.js回调函数

Node.js异步编程直接体现就是回调。回调函数在完成任务后会被调用,Node使用了大量的回调函数,所有API都支持回调函数。

阻塞代码实例
  1. 创建一个1.2.input.txt文本,内容如下(注意需要使用UTF8编码格式保存,否则会中文乱码)
Hello, I'm input.txt!这是一个Input.txt文件!
  • 创建一个1.2.main.js文件,代码如下(同样以UTF8格式保存,我使用的编辑器是NotePad++,有修改编码格式的功能)
var fs = require("fs");
var data = fs.readFileSync('1.2.input.txt');
console.log(data.toString());
console.log("程序执行结束!");
  • 执行以上代码,结果如下:


    执行node 1.2.main.js
非阻塞代码实例
  1. 文本文件1.2.input.txt与之前相同;
  • 修改1.2.main.js内容,如下:
var fs = require("fs");
fs.readFile('1.2.input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});
console.log("程序执行结束!");
  • 执行以上代码,结果如下:


    执行node 1.2.main.js

可以看出非阻塞代码不需要等待文件读取完即可执行,不需要按照顺序进行,所以如果需要处理回调函数的参数,就需要写在回调函数内。

三、Node.js事件循环

  • Node.js是单进程单线程应用程序,但通过事件和回调支持并发,所以性能高;
  • Node.js的每一个API都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发;
  • Node.js基本所有的事件机制都是用设计模式中的观察者模式实现;
  • Node.js单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。
事件驱动程序

Node.js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后服务下一个web请求;
当这个请求完成,它被放回处理队列,当到达队列开头,结果被返回给用户;
web server一直接受请求而不等待任何读写操作(称之为非阻塞IO或事件驱动IO),在事件驱动模型中,会生成一个主循环监听事件,检测到事件时触发回调函数。


事件驱动
  1. Node.js有多个内置事件,可通过引入events模块,并通过实例化
    EventEmitter 类来绑定和监听事件,如下:
// 引入events模块
var events = require('events');
// 创建eventEmitter对象
var eventEmitter = new events.EventEmitter();

以下绑定事件处理程序:

// 绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);

通过程序触发事件:

// 触发事件
eventEmitter.emit('eventName');
  • 实例
    创建1.3.1.main.js文件,代码如下:
// 引入events模块
var events = require('events');
// 创建eventEmitter对象
var eventEmitter = new events.EventEmitter();
// 创建事件处理程序
var connectHandler = function connected() {
    console.log('连接成功。');
    // 触发data_received事件
    eventEmitter.emit('data_received');
}
// 绑定connection事件处理程序
eventEmitter.on('connection', connectHandler);
// 使用匿名函数绑定data_received事件
eventEmitter.on('data_received', function() {
    console.log('数据接收成功。');
});
// 触发connection事件
eventEmitter.emit('connection');
console.log("程序执行完毕。");
执行结果
Node应用程序的工作过程

在Node应用中,执行异步操作的函数将回调函数作为最后一个参数,回调函数接受错误对象作为第一个参数。

  1. 继续使用之前的1.2.input.txt文本文件;
  • 创建1.3.2.main.js,内容如下:
var fs = require("fs");
fs.readFile('1.2.input.txt', function (err, data) {
    if (err) {
        console.log(err.stack);
        return ;
    }
    console.log(data.toString());
});
console.log("程序执行完毕!");

以上程序fs.readFile()是异步函数用于读取文件。如果读取中发生错误,err对象会输出错误信息;如果不发生错误,文件内容通过回调函数输出。以上代码执行结果如下:


执行结果
  • 如果没有1.2.input.txt文件,执行结果如下,输出了错误信息:


    没有txt文本时执行结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容