Node.js第一个服务器程序(入门篇)(一)

 

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
Java代码   收藏代码
  1. var http=require('http');    
  2. http.createServer(function(request,res){    
  3.      res.writeHead(200,{'Content-Type':'text/.plain'});    
  4.      res.end('Hello World!');    
  5. }).listen(3000,'127.0.0.1');    
  6. console.log('服务器启动:http://localhost:3000');    
这时,大家打开浏览器就会看到(地址:http://localhost:3000):
Hello World!
现在解释下这个程序:
var http=require('http');表示定义一个http变量,并且http变量接收的导入的'http'模块。如果你熟悉JAVA,那么就相当于import,C++,就相当于#include,C#就相当于using,python就相当于import。
http.createServer()是一个方法,该方法的作用是创建一个服务器。里面具有一个参数,就是回调函数。改回调函数式匿名函数,匿名函数的参数是两个对象:request(请求)、response(响应)。当然为了程序的清晰和方便调试,打印调用堆栈。那么我们尽量这样写。
Js代码   收藏代码
  1. var appCb=function(request,res){    
  2.      res.writeHead(200,{'Content-Type':'text/.plain'});    
  3.      res.end('Hello World!');    
  4. };    
  5. var server=http.createServer(appCb);    
  6. server.listen(3000,'127.0.0.1');   
 
我们可以看到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://nodejs.org/api/http.html
刚才也看到了,http.createServer()创建了一个HttpServer的实例。Http模块式Node的核心模块,核心API。其实后面将会说到的express框架的原理也是基于HTTP基础的。
 
(1)HTTP服务器Class: http.Server
创建HTTP服务器首先第一步就是http.createServer(),该方法创建的是一个新的服务器,返回的是一个Server类的实例。
Java代码 
  1. 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的实例。其实,这就是两个对象针对请求和响应做的相关处理。
 
Java代码   收藏代码
  1. var http=require('http');    
  2. http.createServer(function(request,response){    
  3.     console.log(request.httpVersion);//获取http协议版本    
  4.     console.log(request.headers);//获取请求头,键值对的形式,请求头的名称都小写    
  5.     console.log(request.trailers);//只有在'end'事件后才有    
  6.     console.log(request.url);//整个请求路径,包括参数,如果是chrome浏览器,则会在请求后,请求/favicon.ico    
  7.     console.log(response.statusCode);//这个只适用于response对象    
  8.     console.log(request.socket);//与该连接相关联的net.Socket对象。老长的一个对象    
  9.     console.log(request.method);//GET 只是用于请求对象    
  10.     response.writeHead(200,{'Content-Type':'text/.plain'});    
  11.     response.end('Hello World!');    
  12. }).listen(3000,'127.0.0.1');    
  13. 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 support url.parse() hostname is preferred over host
  • 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 to Connection: keep-alive. Possible values:
    • undefined (default): use global Agent for this host and port.
    • Agent object: explicitly use the passed in Agent.
    • false: opts out of connection pooling with an Agent, defaults request to Connection: close.
具体的,上面说的很清楚,我就不多说了。那么callback是可选参数,callback其实作为一个参数传递,传递的是一个response事件。response事件的声明为 function(response){ }.
http.request返回的是一个http.ClientRequest的实例。话不多上例子:
Java代码   收藏代码
  1. var http=require('http');    
  2. var options = {    
  3.     hostname: '123.sogou.com',    
  4.     port: 80,    
  5.     path: '/upload',    
  6.     method: 'POST'    
  7. };    
  8. var req = http.request(options, function(res) {    
  9.     res.setEncoding('utf8');    
  10.     //这里会分段发送返回数据,所以对数据的处理,要等数据加载完毕后,才能处理,因为需要监听'end'事件。    
  11.     res.on('data', function (chunk) {    
  12.         console.log('BODY: ' + chunk);    
  13.     });    
  14.     //这个需要自己在外面定义一个临时变量,然后再'data'事件中,不断向变量添加数据,再到'end'事件中处理数据    
  15.     //res.on('end',function(){    
  16.     
  17.     //});    
  18. });    
  19.     
  20. req.on('error', function(e) {    
  21.     console.log('problem with request: ' + e.message);    
  22. });    
  23.     
  24. req.end();    
  
(5)http.get(options,[callback])
这个方法是为了更加方便的使用get请求,因为大多数情况下,GET请求更为方便。这也是,http.request的get简化版本,具体功能如上。
未完,请看系列之二: Node.js的HTTP与事件初步介绍&如何查看API(入门篇)(二)

你可能感兴趣的:(node,node.js)