Node.js第一个服务器程序
如果,你是Node的大牛或者Node学习了好几个月(算是个开发者),那么一下的系列文章,就不用看了,怕是浪费了大伙的时间。当然也可以给我提出许多宝贵的建议和意见哦。如果你准备关注Node,或者准备从事Node的开发,下列系列文章可以看看。同时,我希望在写Node程序之前有一些前端的基础,只要基本了解Javascript的弱类型和回调、事件等基本语法即可,如果想深入Node,完完全全学习js是必不可少的。现在,我们来看Node第一个程序。
一、Node简介
Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
二、Node的安装和环境配置
下载:
http://nodejs.org/download/ 可以根据自己的系统选择下载相应的安装程序。
安装:
windows就是next,然后配置环境变量path即可,别的可以到网上看看,这里说的很明白,http://www.infoq.com/cn/articles/nodejs-npm-install-config
编译:
直接在cmd中 node 你的.js文件名称
三、Hello world
不用多说,直接上程序。helloWorld.js
这时,大家打开浏览器就会看到(地址:http://localhost:3000):
Hello World!
现在解释下这个程序:
var http=require('http');表示定义一个http变量,并且http变量接收的导入的'http'模块。如果你熟悉JAVA,那么就相当于import,C++,就相当于#include,C#就相当于using,python就相当于import。
http.createServer()是一个方法,该方法的作用是创建一个服务器。里面具有一个参数,就是回调函数。改回调函数式匿名函数,匿名函数的参数是两个对象:request(请求)、response(响应)。当然为了程序的清晰和方便调试,打印调用堆栈。那么我们尽量这样写。
我们可以看到createServer产生了一个对象,我们用server接收,然后监听server对象的3000端口。
很方便大家可以看到一个服务器就启动了,为了运行程序,可以在cmd进去后,node helloWorld.js,编译完成,可以访问了。Node的突出特点就显现了,Node可以编写服务器,而一般的web工程都会有web容器(web服务器,例如IIS、Tomcat等等),只有在web容器的承载下,才会动态执行。虽然,有时候你觉得这样创建很麻烦,但是这也是Node优势所在,可以定制自己的web服务器,减少web容器,直接和浏览器交互。后面还会介绍更简单的方式,采用框架(Express)去开发web项目。
如果之前你了解web开发,那么你肯定知道在request和response中会有很多对象和方法。所以,我们对路由进来的请求可以,获取数据和响应。
4、HTTP
刚才也看到了,http.createServer()创建了一个HttpServer的实例。Http模块式Node的核心模块,核心API。其实后面将会说到的express框架的原理也是基于HTTP基础的。
(1)HTTP服务器Class: http.Server
创建HTTP服务器首先第一步就是http.createServer(),该方法创建的是一个新的服务器,返回的是一个Server类的实例。
- http.createServer([requestListener])
说明:Returns a new web server object.The requestListener is a function which is automatically added to the 'request' event.
- Class: http.Server
- Event: 'request'
- Event: 'connection'
- Event: 'close'
- Event: 'checkContinue'
- Event: 'connect'
- Event: 'upgrade'
- Event: 'clientError'
- server.listen(port, [hostname], [backlog], [callback])
- server.listen(path, [callback])
- server.listen(handle, [callback])
- server.close([callback])
- server.maxHeadersCount
- server.setTimeout(msecs, callback)
- server.timeout
这是整个http.Server的结构。首先,看一下request的事件,即第一个Event。request事件是一个函数,包含两个参数,request和response。即
function (request, response) { }。只要有请求,事件就会被自动触发。例如浏览器每一次访问,就会针对每一次访问触发request事件。参数request是http.IncomingMessage的一个实例,response 是一个 http.ServerResponse的实例。其实,这就是两个对象针对请求和响应做的相关处理。
- var http=require('http');
- http.createServer(function(request,response){
- console.log(request.httpVersion);//获取http协议版本
- console.log(request.headers);//获取请求头,键值对的形式,请求头的名称都小写
- console.log(request.trailers);//只有在'end'事件后才有
- console.log(request.url);//整个请求路径,包括参数,如果是chrome浏览器,则会在请求后,请求/favicon.ico
- console.log(response.statusCode);//这个只适用于response对象
- console.log(request.socket);//与该连接相关联的net.Socket对象。老长的一个对象
- console.log(request.method);//GET 只是用于请求对象
- response.writeHead(200,{'Content-Type':'text/.plain'});
- response.end('Hello World!');
- }).listen(3000,'127.0.0.1');
- console.log('服务器启动:http://localhost:3000');
(2)http.ServerResponse
服务响应对象,该对象由HTTP Server在内部创建,不是用户自行创建。也就是request事件的第二个参数。http.createServer(function(request,response){});
- Class: http.ServerResponse
-
- Event: 'close'
- Event: 'finish'
- response.writeContinue()
- response.writeHead(statusCode, [reasonPhrase], [headers])
- response.setTimeout(msecs, callback)
- response.statusCode
- response.setHeader(name, value)
- response.headersSent
- response.sendDate
- response.getHeader(name)
- response.removeHeader(name)
- response.write(chunk, [encoding])
- response.addTrailers(headers)
- response.end([data], [encoding])
这里,我们可以看到在Hello world中调用的函数writeHead,write,end等。writeHead是发送一个响应头,其中statusCode是状态,例如:404 no found,200,502等等。可以参考http://www.daqianduan.com/4280.html。其余的不用说了,大家可以参阅Node官网啦。大家现在就应该很清楚Hello world的程序结构了吧。
(3)http.IncomingMessage
其实,在第(1)小节的程序里,已经用到了IncomingMessage对象,例如:console.log(request.httpVersion);
那么IncomingMessage是什么东西呢?它由http.server或者http.ClientRequest创建,即request和response事件的第一个参数。
- http.IncomingMessage
- Event: 'close'
- message.httpVersion
- message.headers
- message.trailers
- message.setTimeout(msecs, callback)
- message.method
- message.url
- message.statusCode
- message.socket
具体的方法和细节,就不用多说了,前面的例子已经说明了,同时看看英文的表述,更为准确啊。
(4)http.request
别小看这个方法,这个可以模拟一个客户端请求。http.request(options,[callback]);
其中,options是一个对象或者一个字符串,如果是一个字符串,将自动转化为对象(后面将介绍url模块).那么,options包含哪些属性呢:
Options:
host
: A domain name or IP address of the server to issue the request to. Defaults to'localhost'
.hostname
: To supporturl.parse()
hostname
is preferred overhost
port
: Port of remote server. Defaults to 80.localAddress
: Local interface to bind for network connections.socketPath
: Unix Domain Socket (use one of host:port or socketPath)method
: A string specifying the HTTP request method. Defaults to'GET'
.path
: Request path. Defaults to'/'
. Should include query string if any. E.G.'/index.html?page=12'
headers
: An object containing request headers.auth
: Basic authentication i.e.'user:password'
to compute an Authorization header.agent
: Controls Agent behavior. When an Agent is used request will default toConnection: keep-alive
. Possible values:-
undefined
(default): use global Agent for this host and port.Agent
object: explicitly use the passed inAgent
.false
: opts out of connection pooling with an Agent, defaults request toConnection: close
.
具体的,上面说的很清楚,我就不多说了。那么callback是可选参数,callback其实作为一个参数传递,传递的是一个response事件。response事件的声明为 function(response){ }.
http.request返回的是一个http.ClientRequest的实例。话不多上例子:
(5)http.get(options,[callback])
这个方法是为了更加方便的使用get请求,因为大多数情况下,GET请求更为方便。这也是,http.request的get简化版本,具体功能如上。
未完,请看系列之二:
Node.js的HTTP与事件初步介绍&如何查看API(入门篇)(二)