三. Node.js的语法是与Javascript一样吗,Processs是什么?
Node.js的语法是与Javascript一样吗?
Q:怎么样,这次是不是能告诉如何简单执行我编写的代码了吗?
A:恩,当然,如果每次都要找到node目录在去执行是相当不合适的,可以这样,我们通过配置一些链接,使得在何处何地都能轻松使用node。
Q:那该怎么样去配置呢?
A:在linux下,其实我们的很多命令程序脚本是存放在如下两个目录中,其中一个是全局/usr/bin,还有一个本地/usr/local/bin,只要是这两个目录下的脚本或者命令都可以快速执行。
Q:那我该怎么做呢?是把node文件复制过去吗?
A:并不是那样,可以这样操作,比如我要将node命令链接到/usr/local/bin下,那么我可以进入/usr/local/bin目录下,然后使用 sudo ln -s /opt/node/bin/node node ,当然你需要将/opt/node/bin/node替换为你的安装node的文件地址,这样的话,我们就可以随时随地进行执行node命令了,然后我们就可以直接使用 node hellonode.js这个命令了。
Q:好的,那我试一试。
(操作中...)
Q:果然如此,这样就方便多了。
A:恩,对的。
Q:那么请告诉我该如何使用Node的语法吧。
A:其实很简单,只要你会Javascript,那么其实你已经掌握了50%的Node.js,甚至可以说80%。
Q:是吗?难道不用多余学习语法吗?
A:不用了,只要你学会了Javascript,你会发现,你会很快上手,只在在服务器端的开发有很多规则需要学习而已。
那注意什么呢?
Q:不过我想应该总归有一些不一样的地方,对吧。
A:呵呵,对,你很聪明,由于是服务器端,所以在浏览器中的Document这个对象就显得不那么友好了,并不会存在DOM这样的结构。
Q:啊?那我是不是就在也碰不到DOM了?
A:呵呵,这不是绝对的,在某些情况下,你可能还是需要用到DOM解析,比如去解析XML或者直接解析HTML文档,那么这些DOM对象还是存在的,不过需要导入一些具有Document对象的包。
Q:明白了。对了,之前我们的例子中有一个process,这个是个什么对象,在Javascript不存在呀。
A:对,这个对象是专属于Node.js的,这个是一个全局的进程对象。
教我如何使用Process吧!
Q:怪不得,我说为什么我没有见过,那么就请告诉我这个对象我该如何使用他吧!
A:process这个对象使用来控制进程的,所以提供了一些与进程相关的操作,这里说几个主要的。
读取命令行参数
代码如下:process-argv.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/**
* 通过process.argv读取命令行参数,其构造如下
* 1.process.argv返回为是一个数组形式
* 2.process.argv[0] 当前命令,一般为node,因为通过node执行
* 3.process.argv[1] 当前命令执行的脚本完整路径
* 4.process.argv[2,n] 命令参数
*/
//这里要实现通过命令行传参数进行求和的算法
console.log(
"1.当前执行的命令为:"
,process.argv[0]);
console.log(
"2.执行的脚本地址为:"
,process.argv[1]);
//这里截取参数数组中有效的参数列表
var
params = process.argv.slice(2);
console.log(
"3.执行的命令参数为:"
,params);
var
result = 0;
for
(
var
i = 0;i<params.length;i++){
//由于传入的参数都是字符串,所以要通过parseFloat进行转换
var
v = parseFloat(params[i]);
//在转换后的值,可能存在非法的非数值的结果,所以通过isNaN进行判断是否为非数值,如果为非数值,则跳过
if
(isNaN(v))
continue
;
result += v;
}
console.log(
"4.计算后的有效值的和为:"
,result);
|
执行结果如下:
1
2
3
4
5
|
node process-argv.js 1 2 H 3 4
1.当前执行的命令为: node
2.执行的脚本地址为:
/home/code/workspace/node/core/process-argv
.js
3.执行的命令参数为: [
'1'
,
'2'
,
'H'
,
'3'
,
'4'
]
4.计算后的有效值的和为: 10
|
使用标准输出输入流
代码如下:process-std.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/**
* 1.process.stdout为标准输出流
* 2.process.stdin为标准输入流,但重点是要启动这个方法,需要通过process.stdin.resume()方法启动。
* 3.实际的console.log的方法也是通过process.stdout输出流构建的。
*/
process.stdout.write(
"开始读取通过标准输入流读取的数据,只能说三句话哦!\n"
);
//启动输入流
process.stdin.resume();
//为输入流设定字符集
process.stdin.setEncoding(
"UTF-8"
);
var
count = 0;
//为输入流监听输入数据事件,回调函数参数为数据
process.stdin.on(
'data'
,
function
(chunk){
count++;
process.stdout.write(
'第'
+count+
'句是,'
+chunk+
'\n'
);
if
(count >= 3) {
//触发结束输入终止事件
process.stdin.emit(
'end'
);
}
});
//为输入流绑定结束事件
process.stdin.on(
'end'
,
function
(){
console.log(
'结束对话!'
);
});
|
执行结果如下:
1
2
3
4
5
6
7
8
9
|
node process-std.js
开始读取通过标准输入流读取的数据,只能说三句话哦!
你好
第1句是,你好
不错
第2句是,不错
非常棒
第3句是,非常棒
结束对话!
|
进程退出方法
代码如下:process-exit.js
1
2
3
4
5
6
7
8
9
10
11
12
|
/**
* 通过process.exit退出当前进程
* 1.参数默认为0,表示正常退出
* 2.参数如果为1,表示非正常强制退出
*/
for
(
var
i = 0;i<100;i++){
if
(i == 3) {
process.exit(0);
}
console.log(
"我在数数:"
,i);
}
console.log(
"I'm here,这里不会被执行!"
);
|
执行结果如下:
1
2
3
4
|
node process-
exit
.js
我在数数: 0
我在数数: 1
我在数数: 2
|
操作队列执行
代码如下:process-next.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
/**
* process.nextTick存放一个放到执行队列队列当中
* 1.当程序执行的时候已经开始有操作队列了,如果将新的操作放到队列中时,那么这个操作会等待该它执行的时候才会执行
*/
//这是没有放置队列操作的一个演示,在Person对象初始化的时候就会执行say方法
var
Person =
function
(){
this
.data =
null
;
this
.say(
this
.data);
};
Person.prototype.say =
function
(thing){
console.log(thing);
};
//Person对象初始化了,同时也执行了say方法,发现最后的结果为null
var
p =
new
Person();
//虽然这里设置了属性data为HELLO,但是在设置属性的之前就已经执行了say,所以这里设置已经没有意义。
p.data =
"HELLO"
;
//这里是设置了操作队列的演示
var
Man =
function
(){
this
.data =
null
;
var
_this =
this
;
/**
* 将say的执行放置在操作队列中,那么这里的操作会按照实际的操作队列进行执行,而不是顺序执行
*/
process.nextTick(
function
(){
_this.say(_this.data);
});
};
Man.prototype.say =
function
(thing){
console.log(thing);
};
//Man初始化,但此时的say方法处于操作队列中,实际这个say之前有一个操作就是下面代码的设置属性
var
m =
new
Man();
//这是操作队列中倒数第二个操作,等待这个操作完成后,会执行最后一个操作,即使say
m.data =
"HELLO"
;
|
执行结果如下:
1
2
3
|
node process-next.js
null
HELLO
|
系统平台信息
代码如下:process-platform.js
1
2
3
4
5
6
|
console.log(
"操作系统,"
,process.platform);
console.log(
"CPU处理位数,"
,process.arch);
console.log(
"当前进程PID,"
,process.pid);
console.log(
"当前node版本,"
,process.version);
console.log(
"当前依赖的版本,"
,process.versions);
console.log(
"当前执行的工作目录,"
,process.cwd());
|
执行结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
node process-platform.js
操作系统, linux
CPU处理位数, ia32
当前进程PID, 18503
当前node版本, v0.10.15
当前依赖的版本, { http_parser:
'1.0'
,
node:
'0.10.15'
,
v8:
'3.14.5.9'
,
ares:
'1.9.0-DEV'
,
uv:
'0.10.13'
,
zlib:
'1.2.3'
,
modules:
'11'
,
openssl:
'1.0.1e'
}
当前执行的工作目录,
/home/code/workspace/node/core
|
一些常用的事件回调
代码如下:process-exit.js
1
2
3
4
5
6
|
/**
* 进程关闭事件
*/
process.on(
'exit'
,
function
() {
console.log(
'About to exit.'
);
});
|
执行结果如下:
1
2
|
node process-event.js
About to
exit
.
|
A:这些并不是全部的内容,只是一些具有代表性质的方法,不过你也应该够使用了,如果还是感觉不足够,那么我告诉你一个地方,你可以参考http://nodejs.org/api/process.html
Q:好的,我已经学习了不少,我要去练习一下
A:祝你顺利,或许你会遇到问题,但这样才能够更加快速地掌握这些知识,不过这只是开始。