- 闲扯
- 上代码
- 创建文件server.js
- 运行程序,启动服务。
- 监听事件,给出反馈。
- 给出响应。
- 总结
Nodejs 既然是作为一门服务端的脚本语言,那么它创建一个HTTP服务是非常简单的。那么我们应该怎么去理解HTTP服务?或者说,我们经常讲到请求服务器,到底是指的什么东西?
我们知道,浏览器发送请求通常是以http协议来请求的,那么请求发送到哪里去了呢?当然是发送到服务器上去了,这不是废话嘛。服务器服务器,说白了就是一台提供服务的机器啊,就是一台计算机啊。那么服务器这台计算机是靠什么来接收请求的呢?既然是通过网络,那么最先接受到请求的必然是网卡啊。网卡经过一些列的处理发现这是一个http请求,如果这个请求指明了端口号,那么这个请求经过网卡被送达到指明的端口上去,如果没有明确的端口,默认会被送达到80端口上去。举个例子,假如你是一条请求,被发往源越大厦这台服务器,你的请求类型是在线教育。到了门口,被保安拦下了,相当于网卡,说要对你进行登记,询问你一些事情,经过询问发现你是一条类型为在线教育的请求,然后开始问你,你有明确的端口号吗?你说:没有。他说,那好吧,在线教育类型的请求默认都统一交给301办公室去处理。这里的301办公室,相当于端口号。
如果301办公室没有公司,那么这条请求就得不到响应。而恰好,在301办公室有一个运转着的EduSoho公司,它会处理所有来到301办公室的请求。那么EduSoho就相当于开启的服务。晚上的时候EduSoho下班了,就相当于服务器上的服务关闭了。
网卡接收网络请求并且分发到对应的端口这件事情不需要我们的程序去做,操作系统和硬件已经帮我们做掉了。那么我们需要做什么?
我们需要做的是创建一个服务(一个可以运转的程序),然后让这个服务去监听那个端口,当端口有被分发过来的请求到来时,我们接受这个请求,并且根据这个请求的相关信息去做一些处理,然后把处理的结果再返回给端口,再通过网卡发回去,也就是送回给客户端的浏览器。
nodejs提供了非常简单的创建http服务的包。那么我们下面就来实现一个可被访问的服务。
上一节我们创建了一个node-test的文件夹,那么今天我们依然在这个文件夹里去操作,去创建一个server.js
的文件。内容如下:
var http = require('http');
var server = http.createServer();
// 如果你的10086端口已经被其它服务占用,
// 可以换成10087,等其它任何没有背占用的端口。
// 不过谁会像我一样这么钟爱10086呢。
server.listen(10086);
okay,程序到这里已经写完了,一个服务的程序已经写好了。但是呢,这个程序还没跑起来,所以还不能监听那个端口。就像上面讲到的EduSoho现在休息状态,得让他跑起来。怎么跑呢?
还记得昨天利用main.js输出Hello world吗?
在终端命令行,跳转到node-test目录下,执行下面的命令。
node server.js
执行之后是不是发现什么都没有?就连终端也停在那里了。
现在访问一下: http://127.0.0.1:10086 发现也是什么都没出来,浏览器tab页上的圆圈一直在转啊转,表示一直在加载状态。这个时候如果把调试模式打开,切换到Network,会发现这个请求的状态会是Pending状态,当然了,一会儿就变成Timeout了。
那么问题来了,为什么呢??
我们先把服务杀死掉。回到终端同时按下Ctrl + C
可以强制退出我们上面运行的服务程序。
Nodejs的官网写道:Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient(Node.js使用事件驱动,非阻塞I/O的模式使得它非常的轻量化和高效)。
那么我们下面就来个事件驱动,做一个事件监听。然后我们修改代码如下:
var http = require('http');
var server = http.createServer();
// 增加事件监听。
server.on('request', function() {
console.log('我收到请求啦!!!');
})
server.listen(10086);
就像我们浏览器做事件监听一样,我给这个服务程序添加了一个事件监听:当受到请求的时候,执行后面的回调函数,也就是打印我收到请求啦!!!
;好,我们再次回到终端,执行node server.js
启动服务程序。并且通过浏览器访问http://127.0.0.1:10086。
访问一次,看一下终端会输出一次我收到请求啦!!!
,再访问一次还会输出,每次刷新页面都会输出。
不错,现在我们的服务程序已经可以监听请求事件了,有请求就会输出我收到请求啦!!!
。但是,,,问题是,我们的浏览器依然没有请求成功,没有显示任何的东西出来。为什么?
我们上面只是做了对请求的监听,但是我们没有给出响应请求的代码。所以浏览器得不到响应结果,就会一直等待,等待的超过一定的时间,就会出现超时错误,不再等待。
下面我们就为上面的代码添加响应代码。
var http = require('http');
var server = http.createServer();
// 增加事件监听。
server.on('request', function(request, response) {
console.log('我收到请求啦!!!');
// 增加响应代码。
response.end('Hello World!');
});
server.listen(10086);
注意上面的代码,时间监听的回调函数在被调用的时候,会被强制传入两个参数,一个是请求对象,一个是响应对象,这两个对象包含有大量的属性和方法,尤其是请求对象,含有大量的请求信息,后面我们会慢慢的去了解这些信息,并且拿过来为我们所用。这里我们只用到了响应对象response
的end
方法。这个方法可以接收三个参数,但是目前我们就先只用第一个,第一个参数就是要返回给浏览器的内容,内容的类型可以是字符串String
和二进制Buffer
。这里我们使用了字符串Helllo World
。
那么我们现在再次杀掉刚才的程序,重启现在的程序,用浏览器访问本地的这个端口。就可以在浏览器里看到Hello World!
的字符串了。同时我们的终端还会输出我收到请求啦!!!
。
至此,我们前后端通信的Hello World程序就算是实现了。
- 重点在于理解浏览器和服务器通信的模式。
- 理解服务端程序做的是哪些事情。
- 熟悉Nodejs这种事件驱动(Event Drive)的模式。