文档章节

[Node.js]三. Node.js的语法是与Javascript一样吗,Processs是什么?

41区开源技术小组
 41区开源技术小组
发布于 2014/09/25 02:20
字数 2077
阅读 27
收藏 0

三. 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

/**
 * 通过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);


执行结果如下:

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.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('结束对话!');
});


执行结果如下:

node process-std.js
开始读取通过标准输入流读取的数据,只能说三句话哦!
你好
第1句是,你好
不错
第2句是,不错
非常棒
第3句是,非常棒
结束对话!

进程退出方法

代码如下:process-exit.js

/**
 * 通过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,这里不会被执行!");


执行结果如下:

node process-exit.js
我在数数: 0
我在数数: 1
我在数数: 2

操作队列执行

代码如下:process-next.js

/**
 * 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";


执行结果如下:

node process-next.js
null
HELLO

系统平台信息

代码如下:process-platform.js

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());


执行结果如下:

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

/**
 * 进程关闭事件
 */
process.on('exit', function() {
  console.log('About to exit.');
});


执行结果如下:

node process-event.js
About to exit.


A:这些并不是全部的内容,只是一些具有代表性质的方法,不过你也应该够使用了,如果还是感觉不足够,那么我告诉你一个地方,你可以参考http://nodejs.org/api/process.html

Q:好的,我已经学习了不少,我要去练习一下

A:祝你顺利,或许你会遇到问题,但这样才能够更加快速地掌握这些知识,不过这只是开始。

本文出自 “博远至静” 博客,请务必保留此出处http://sunspot.blog.51cto.com/372554/1265650

© 著作权归作者所有

41区开源技术小组

41区开源技术小组

粉丝 5
博文 17
码字总数 16241
作品 3
大兴
程序员
私信 提问
Node.js---01、初识NodeJS和Node.js的HTTP服务器搭建

一、前言 我们先从以下几个方面在大体上认识一下Node.js: Node.js 是什么?==> 运行环境 是一个 可以运行 并加载 ES语法的 脚本运行环境 JS(ES5)、ES6、Common.js 语法 …… Node.js 可以加...

秋季长青
2017/11/06
0
0
Chrome V8 与 Node.js

从某种意义上来说,Node.js 并不是一个从零开始编写的 JavaScript 运行时,它其实也是站在“巨人的肩膀”上进行了一系列的拼凑和封装得到的结果。它的高效离不开一些很牛的第三方程序和类库。...

博文视点
2018/06/14
0
0
PHP vs Node.js

网络正在处于一个日新月异的发展时代。服务器端开发人员在选择语言的时候非常困惑,有长期占主导地位的语言,例如C、Java和Perl,也有专注于web开发的语言,例如Ruby、Clojure和Go。只要你的...

oschina
2015/07/08
17K
77
EZo UIBuilder Version 1.4 Release.

本次 EZo UIBuilder V1.4 的新功能有: ‧支援 Node.js,可使用 JavaScript 打造前后端,一气呵成。 ‧强化设计工具功能。 ‧在线编辑器扩充支持原生 .html ,.js文件格式。 ‧提升 GWT 版本...

陈威宇
2012/09/19
545
0
Node.js 宣布一个新的 --experimental-modules【译】

原文:Announcing a new --experimental-modules 译文地址 在2017年,Node.js 8.9.0发布了对ECMAScript模块的实验性支持。这种ECMAScript模块的支持是需要在后面加上标识来运行。 现在,主流浏...

flytam
05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

NIO基于长度域的报文在Netty下的解码

1, 先复习一下粘包/拆包 1.1, 粘包/拆包的含义 TCP是个“流”协议, 并不了解上层业务数据的具体含义, 它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP...

老菜鸟0217
今天
8
0
从零开始搭建spring-cloud(2) ----ribbon

在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。 其实我们已经在上...

Vincent-Duan
今天
19
0
get和post的区别?

doGet:路径传参。效率高,安全性差(get的传送数据量有限制,不能大于2Kb) doPOST:实体传参。效率低,安全性好 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Pos...

花无谢
昨天
4
0
当谈论迭代器时,我谈些什么?

当谈论迭代器时,我谈些什么? 花下猫语:之前说过,我对于编程语言跟其它学科的融合非常感兴趣,但我还说漏了一点,就是我对于 Python 跟其它编程语言的对比学习,也很感兴趣。所以,我一直...

豌豆花下猫
昨天
14
0
10天学Python直接做项目,我做了这5件事

初学者如何尽快上手python? 市面上关于如何学python的资料很多,但是讲的都太复杂。 我就是很简单的几句话,从小白到开发工程师,我只做了五件事。 我觉得任何商业计划书如果不能用几句话讲...

Python派森
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部