Nodejs学习item【入门手上】


Posted in NodeJs onMay 05, 2016

一、 安装

首先,去http://nodejs.org 下载安装。我下的版本是0.8.14。安装很简单,下一步下一步就哦了。然后在path中配置一下安装目录即可,msi会把npm(Node Package Manager)一并装上。

Nodejs学习item【入门手上】

我的安装目录是C:\Program Files (x86)\nodejs。这时使用cmd命令窗口 node -vnpm -v命令查看下安装的版本

Nodejs学习item【入门手上】

1.1、helloworld

在Node.js工程目录中新建一个文件hello.js,里面敲一行代码

console.log('hello, nodejs.') ;

进入命令行控制台,进入到Node.js工程目录敲node hello.js

Nodejs学习item【入门手上】

控制台输出了“hello, nodejs.”

1.2、web版的helloworld

在Node.js工程目录中新建一个http.js,代码如下

var http = require("http");
http.createServer(function(request, response) {
 response.writeHead(200, {"Content-Type": "text/html"});
 response.write("Hello World!");
 response.end();
}).listen(8000);

在命令行中启动服务,敲 node http.js

Nodejs学习item【入门手上】

然后打开浏览器地址栏输入http://localhost:8000/,看见页面上输出Hello World! 就成功了。

Nodejs学习item【入门手上】

node.js的版本一定和API同步

node.js的版本号有规律,偶数版本为稳定版本,奇数版本非稳定版本

2 HelloWorld代码分析

好啦,从现在开始逐行分析我们的HelloWorld。

引入模块

var http = require("http");

require方法用来引入一个模块,参数是模块的名字。比如File System模块,可以这么引入:

var fs = require("fs");

我们可以把require()方法当做全局方法使用,但实际上它更像属于某个模块的本地方法,它的文档参考这里:https://nodejs.org/api/globals.html。

require方法返回某个模块的实例,比如require(“http”)就返回一个HTTP实例。HTTP实例的参考文档在这里:https://nodejs.org/api/http.html。

我们看到,HTTP模块有一个方法createServer(),就牵涉到我们的第二行代码了。

创建服务器

HTTP模块的createServer()方法,接受一个方法作为参数,原型为:

http.createServer([requestListener])

requestListener是一个方法,会与http.Server类的request事件关联起来。这样当客户端请求到达时,requestListener就会被调用。

requestListener有两个参数,函数原型如下:

function (request, response) { }

第一个参数request的类型是http.IncomingMessage,实现了Readable Stream接口。
第二个参数的类型是http.ServerResponse,实现了Writeable Stream接口。

Stream的API在这里:https://nodejs.org/api/stream.html。同时,request和response还是EventEmitter,可以发射特定的事件。

EventEmitter的API在这里:https://nodejs.org/api/events.html#events_class_events_eventemitter,后面我们会讲如何使用EventEmitter来发射事件、处理事件。

再回顾一下我们创建server的代码:

http.createServer(
 function(request, response) { 
  response.writeHead(200, {"Content-Type": "text/plain"}); 
  response.write("Hello World!"); 
  response.end(); 
 }
).listen(8000);

http.createServer返回一个http.Server实例,http.Server的listen方法可以让服务器监听在某个端口上,示例中是8000。

如你所见,我们提供了一个匿名函数给createServer方法。在这个方法中,我们通过response参数向客户端回写了“Hello World!”消息。

分析客户端请求

前面我们分析了http.createServer方法,它的参数是一个带两个参数的方法,一个代表了客户端发过来的请求,一个代表了要回写给客户端的响应。我们来看看request参数。

request是http.IncomingMessage的实例,通过这个实例,我们可以拿到请求参数,比如HTTP方法、HTTP版本、url、头部等,具体的API在这里:https://nodejs.org/api/http.html#http_http_incomingmessage。

我们通过修改HelloWorld.js来看看(另存为HelloWorld2.js)。代码如下:

// 引入http模块
var http = require("http"); 

// 创建server,指定处理客户端请求的函数
http.createServer(
 function(request, response) { 
  console.log("method - " + request.method);
  console.log("version - " + request.httpVersion);
  console.log("url - " + request.url);
  response.writeHead(200, {"Content-Type": "text/plain"}); 
  response.write("Hello World!"); 
  response.end(); 
 }
).listen(8000); 

console.log("Hello World start listen on port 8000");

如你所见,我使用console这个对象来输出了一些调试信息,打印了HTTP方法、版本、url等信息。可以执行node HelloWorld2.js,浏览器访问http://localhost:8000,然后跑到命令行看看输出了什么信息,我这里是这样的:

Nodejs学习item【入门手上】

我们简简单单的HelloWorld已经可以发送一些响应数据给客户端,你在浏览器里能看到“Hello World!”字样。这个响应是通过http.ServerResponse的实例response发送给客户端的。

http.ServerResponse也是一个Stream,还是一个EventEmitter。我们通过它给客户度返回HTTP状态码、数据、HTTP头部等信息。

HTTP模块
在Node.js的HTTP模块,状态行就是通过http.ServerResponse的writeHead方法写给客户端的。writeHead方法原型如下:

response.writeHead(statusCode[, statusMessage][, headers])

这个方法的第一个参数,就是statusCode,也就是200、403之类的数字,剩下的参数是可选的。最后一个参数是headers,你可以在这里使用JSON对象表示法来写一些HTTP头部,比如:{“Content-Type”:”text/plain”,”Content-Length”:11}。第一个可选参数statusMessage用来指定一个状态描述消息,可以不填写。

HTTP头部

头部就是一些key-value对,比如我们在HelloWorld里看到的”Content-Type”,就是用来说明数据类型的头部标签,对应的可能是文本文件、图片、视频、二进制等。类似的还有”Content-Length”,用来指定数据长度。还有很多很多,比如”Date”、”Connection”等。具体还是参考前面的链接吧。

头部还可以使用http.ServerResponse的response.setHeader(name, value)方法来单独设置,一次可以设置一个HTTP头部。

数据

头部之后就是数据了,有些状态码,比如200,后续都会有一些数据。而有些,比如301、404、403、500之类的,多数没有数据。

数据通过http.ServerResponse的write方法来写回给客户端,比如这样:

response.setHeader("Content-Type", "text/html");

这里要提一点,HTTP常见的数据传输编码方式有两种:

设置Content-Length,传输固定长度的数据设置Transfer-Encoding头部为chunked,分块传输数据

像我们现在的HelloWorld示例,没有设置Content-Length头部,Node.js的HTTP模块就默认为chunked编码。

我们使用Chrome浏览器的开发者工具来查看网络数据,可以很明确的看到。如下图所示:

Nodejs学习item【入门手上】

HTTP响应

我标注出来的三处,都是HelloWorld示例传递给浏览器的HTTP头部信息。

我们通过http.ServerResponse的write方法向客户端写数据。你可以一次写入所有数据,也可以把数据分开来多次写入。当要传输的数据量较大时,分多次写入就是比较合理的做法,比如你向客户端发送大文件,就比较适合分多次写入,也可以利用Node.js的异步特性,获得不错的性能。

NodeJs 相关文章推荐
利用NodeJS的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
14款NodeJS Web框架推荐
Jul 11 NodeJs
NodeJS学习笔记之网络编程
Aug 03 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
nodejs实现发出蜂鸣声音(系统报警声)的方法
Jan 18 NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 NodeJs
NodeJS的Promise的用法解析
May 05 #NodeJs
Windows 系统下设置Nodejs NPM全局路径
Apr 26 #NodeJs
Nodejs Stream 数据流使用手册
Apr 17 #NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 #NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 #NodeJs
Nodejs如何搭建Web服务器
Mar 28 #NodeJs
Nodejs中的this详解
Mar 26 #NodeJs
You might like
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
js读取配置文件自写
2014/02/11 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
python与C互相调用的方法详解
2017/07/14 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
详解Python的循环结构知识点
2019/05/20 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
wxPython多个窗口的基本结构
2019/11/19 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
英国品牌男装折扣网站:Brown Bag
2018/03/08 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
计算机专业自我鉴定
2013/10/15 职场文书
小学教师的个人自我鉴定
2013/10/24 职场文书
应聘编辑自荐信范文
2014/03/12 职场文书
小学节能减排倡议书
2014/05/15 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
python中validators库的使用方法详解
2022/09/23 Python