1:高并发、高I/O场景
2:逻辑较少
3:追求响应速度的项目
以上三点是我们使用NodeJs所要考虑的,由于nodejs是单线程、异步I/O的、事件驱动的语言,所以带来响应速度的基础上也会有很多坑,鉴于此篇博文是纯新手向的,所以并不多阐述回调带来的代码混乱问题,
仅致力于带领读者入门,可以自行搭建http服务器。
同时 如果你想学习nodejs,建议你掌握javascript的底层知识,包括闭包,原型链,OOP等。如果你熟悉commonJS会对你学习nodejs带来更好的体验。
一:安装
安装就不多说了 现在网上一搜一大堆教程,Mac的 linux的 windows的都有 大家可以查看一下
二:第一个应用
nodejs有两种方式可供调试代码,第一种是直接用控制台交互
安装完nodejs之后,Ctrl + R打开命令行,输入node 就回进入到交互界面
在交互界面支持所有js的表达式 和运算符
你可以:
var a = 1,b = 2; //保存变量 a + b //输出结果 3支持定义变量和运算 当然 也支持js的调试方法 比如:
console.log("2"); //输出2 console.log(2); //输出2 var a = 2; console.log(a); //输出2三:搭建http服务器
我相信上面的那些东西 很少有人会喜欢看,根本跟我们要说的没什么关系嘛!!
当然 我也觉得 不过有时候debug还是有些用处的。
好吧 既然想听干货,那我们下面就说说正题,搭建一个web服务器
在nodejs中 基本上所有方法都依赖”模块“,nodejs中封装好了很多模块供我们使用,调用模块也很方便:利用 require 方法将模块存到变量里就可以拿来使用了:
var http = require("http"); http.createServer(function(req,res){ }).listen(8888);如上所示,利用require方法获得模块,将模块赋值到http变量上,require里的值必须是字符串。
这里多插一句话,有些童鞋可能会觉得nodejs是一门新的语言,对模块、服务器状态啥啥的搞不懂,这都是个什么玩意?
一如我开头所说,nodejs作为js在服务器上的运行环境,你可以完全把它看成是js 没有任何问题,他的数据类型、语法、对象都与js一毛一样,so 别害怕 其实很简单。
你可以把模块看做事一个js的对象,还记得js的对象是什么么? 我们可以把对象看成是一个无序的键值对,这样看起来是不是清晰多了?
你可以暂时将其想象为:
http = { a:function(){}, b:function(){} }nodejs有两种模块形式,一种是原生模块,即nodejs已定义好的模块,就像上面的http一样
第二种是我们自定义的模块,为了实现某些功能和便于管理,我们经常会将我们的代码封装成一个一个的模块,尽量解耦其间的依赖关系,使代码可以复用。
在nodejs中,每一个js文件即使一个自定义模块,引入方法也很简单:
var server = require("./server");后面直接加上访问路径即可,访问路径可以是绝对路径也可以是相对路径。
如果你的路径中没有此文件,nodejs会向下查找直到找到这个模块然后引入,所以如果你有两个相同的模块(比如两个服务器模块),最好还是把路径写对的好。
为什么讲上面这些呢? 因为我们想要搭建一个http服务器,需要用到http模块
这里我们可以新建一个server.js文件,将下面的代码复制进此文件:
var http = require("http"); http.createServer(function(req,res){ res.writeHead(200,{"Content-type":"text/blain"}); res.write("Hello NodeJs"); res.end(); }).listen(8888);这样我们就完成了一个http服务器的搭建,我们先来试下效果 打开命令行,进入到项目目录 也就是server.js的存放目录,然后输入:
node server.js //记住这个命令然后打开浏览器,访问localhost:8888,是不是出现熟悉的Hello NodeJs了呢?
下面我们来一点一点看上面的代码,力求用最简单的话来解释清楚
首先我们看到 我们调用了http的creatServer方法,这个方法就是nodejs用来创建一个http服务器的方法,这个方法本身什么都不会做,只会创建一个http服务器,但是他有且仅有一个回调函数
从这里我们可以看到 nodejs里面会大量的用到callback 即回调函数,熟悉javascript的童鞋应该会很熟悉,尤其是经常使用jquery的朋友。
回调函数,从字面理解就很容易理解的通,在我发送一条请求的时候,不会立即响应,而是在处理完成后调用此函数,此函数会返回结果。
那这个回调函数有什么作用呢? 在这个回调函数里我们看到有两个参数,req 和res 即request 和 response 翻译过来也很好理解了,请求和响应。
说到这讲点题外话,web服务器是如何工作的呢?大致可以分为几步:
1:客户端(即浏览器)发送请求
2:服务器接收请求
3:服务器响应请求开始相应逻辑处理
4:最后返回数据给客户端
5:客户端渲染数据
上述第一步和第五步就是传统前端在做的事情,而 2-4步即是nodejs 也就是服务器在做的事情。
知道了web响应过程,我们再来看这两个参数:
request 是请求,即是向服务器发送请求,暂时我们还用不上。
response 是响应,我们也可以把它看成是一个对象,有键值对,有方法。
上面我们调用了response的三个方法
1:res.writeHead(200,{"Content-type":"text/blain"});
这个方法主要管的是向客户端发送一个响应头部 200即是HTTP状态码 不懂得朋友可以看下这里:
http://www.daqianduan.com/4280.html
状态码后面跟着一个对象,对象里面是一个键值对,Content-type代表文档类型,text/blain代表具体的文档类型。
我们可以试着回顾一下,web的运行原理,我们发送请求,服务器响应请求返回给我们响应页面数据,那既然是页面数据,一定有相应的文档类型,text、css、heml、等
既然这样 我们总要指定打印出来的这个数据是个什么东西对么?所以响应头部中的文档类型是非常重要的。
2:res.write("Hello NodeJs");
这个方法很一目了然了,我们想要给客户端发送数据和页面,总要有一个方法来执行才行,所以我们利用res.write()方法来发送我们想要发送的东西。
3:res.end();
最后调用res.end()方法来为本次响应打上一个句号。有开始有结束。