Node.js服务器端编程实践(一):服务器创建与hello world应答

来源:互联网 发布:知乎 清华法学院体验 编辑:程序博客网 时间:2024/05/16 11:40

在搭建好了Node.js的运行环境和编辑器以及对Node.js的相关特性和语法特点有了基本掌握之后,就可以上手开发第一个服务器程序了。和其他语言的学习一样,我们通过服务器给网页一个响应(response),在网上里面显示一个提示字符串”hello world”作为应答,下面就进入构建一个最基础的Http服务器的主题。

首先来看代码

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

在notepad++里面写上以上代码就表示完成了一个可以工作的http服务器了。

下面是执行后效果:

这里写图片描述

输入url:http://localhost:8888/
网页显示hello world提示
localhost也就是本机地址,IP地址就是127.0.0.1

那么整个过程是如何实现的呢?想明白这个之前,先分析一下上面几行代码的意思:
第一行:请求(require)node.js自带的http模块,并且将它赋值给http变量。
接下来我们调用http模块提供的函数: createServer 。这个函数会返回一个对象,这个对象有一个叫做 listen 的方法,这个方法有一个数值参数,指定这个HTTP服务器监听的端口号。其实就是启动服务器并监听port端口。

var http = require("http");var server = http.createServer();server.listen(8888);

这段代码只会启动一个侦听8888端口号的服务器,http模块的createServer()函数(java里面称之为方法)会创建一个服务器,并对端口号为8888进行监听。但是要是就这样没其他代码,这个服务器啥也不干,仅仅是监听8888的端口号而已。就算监听到了啥也没有任何的应答,因此做些必要的动作是必须的。这样就需要看看createServer()里面·都有啥了。(暂时不管createServer()函数参数传递问题,待会儿会讲到)

下面就是服务器帧听到8888号端口有了动作请求之后所做的一些应答(response):

  response.writeHead(200, {"Content-Type": "text/plain"});  response.write("Hello World");  response.end();

当收到请求时,使用 response.writeHead() 函数发送一个HTTP状态200和HTTP头的内容类型(content-type),使用 response.write() 函数在HTTP相应主体中发送文本“Hello World”。
最后,我们调用 response.end() 完成响应。
简单解释一下 :http状态码200表示服务器已成功处理了请求。ContentType属性指定响应的 HTTP内容类型,这里指定为text/plain格式,表示无格式正文。
好了,这样基本就明白了hello world输出原理了。

关于node.js匿名函数的几点说明:

看上面的这行代码:

http.createServer(function(request, response)

很奇怪function后面没有函数名字就是直接两个参数的传递。
那就来看下面一段代码:

function write(word) {  console.log(hello word);}function execute(someFunction, value) {  someFunction(value);}execute(write, "Hello world");

write函数作为execute函数的第一个变量进行了传递。这里传递的不是 write 的返回值,而是 write 本身!
这样一来, write就变成了execute 中的本地变量 someFunction ,execute可以通过调用 someFunction() (带括号的形式)来使用 write函数。我们可以就像刚才那样,用它的名字把一个函数作为变量传递。我们可以直接在另一个函数的括号中定义和传递这个函数:

function execute(someFunction, value) {  someFunction(value);}execute(function(word){ console.log(word) }, "Hello");

execute 接受第一个参数的地方直接定义了我们准备传递给 execute 的函数,这种方式,我们甚至不用给这个函数起名字,这也是为什么它被叫做 匿名函数。
看到这应该明白了最初创建服务器那行代码使用的匿名函数的原理了。

对“基于时间驱动的回调”方式的理解

Node.js是事件驱动的,当我们使用 http.createServer 方法的时候,我们当然不只是想要一个侦听某个端口的服务器,我们还想要它在服务器收到一个HTTP请求的时候做点什么,我们创建了服务器,并且向创建它的方法传递了一个函数。无论何时我们的服务器收到一个请求,这个函数就会被调用。我们不知道这件事情什么时候会发生,但是我们现在有了一个处理请求的地方:它就是我们传递过去的那个函数。至于它是被预先定义的函数还是匿名函数,就无关紧要了。
这个就是传说中的 回调 。我们给某个方法传递了一个函数,这个方法在有相应事件发生时调用这个函数来进行 回调 。

1 0
原创粉丝点击