【node.js】一个基于HTPP的服务

构建应用的模块

基于HTTP服务器

当我准备开始写一个我的第一个”真正的“node.js应用的时候,我不但不知道怎么写node.js代码,也不知道该怎么组织这些代码。

我应该把所有东西都放进一个文件里吗? 网上有很多教程都会教你把所有的逻辑内容都放进一个用node.js写的基础HTTP服务器里。但是如果我想加入更多的内容,同事还想保持代码的可读性呢?

实际上,只要把不同功能的代码放如不同的模块中,保持代码分离还是相当简单的。

这种方法允许你拥有一个干净的主文件,你可以用node.js来执行它;同时你可以拥有干净的模块,他们可以被主文件和其他的模块调用,

那么,现在我们来创建一个用于启动我们应用的主文件,和一个保存着我们HTTP服务器代码的模块。
新建一个叫server.js的文件

var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');

搞定!完成了一个可以工作的HTTP服务器,为了证明这一点,我们来运行并且测试这段代码。首先,用node.js来执行。

node server.js

接下来打开浏览器访问http://127.0.0.1:8124/,你就可以看到一个写着”Hello World“的网页。

这很有趣吧,不是吗?先来分析一下

HTTP服务器的构成

第一行请求(require)node.js自带的http模块,并且把它赋值给http变量。

接下来调用http模块提供的函数:createServer。这个函数会返回一个对象,这个对象有一个叫做listen的方法,这个方法有一个数值参数,执行一个HTTP服务器监听的端口号。

可以用这样的代码来启动服务器并侦听8124端口:

var http = require("http");

var server = http.createServer();
server.listen(8124);

实际上,这个函数定义是createServer()的第一个也是唯一一个参数,因为在JavaScript中,函数和其他变量一样都是可以被传递的。

进行函数传递

举列来说,可以这么做:

function say(word) {
  console.log(word);
}

function execute(someFunction, value) {
  someFunction(value);
}

execute(say, "Hello");

在这里我们把say函数作为execute函数的第一个变量进行了传递,这里传递的不是say的返回值,而是say本身。

这样一来,say就变成了execute中的本地变量someFunction,execute可以通过调用someFunction()来使用say函数。

当前,因为say有一个变量,execute在调用someFunction时可以传递这样一个变量。

可以把函数作为一个变量传递,可以直接在另一个函数的括号中定义和传递这个函数:

function execute(someFunction, value) {
  someFunction(value);
}

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

execute接受第一个参数的地方直接定义了我们准备传递给execute的函数,用这样的方式我们甚至不用给这个函数起名字,这也是为什么它会被叫做匿名函数。

函数传递是如何让HTTP服务器工作的

带着这些知识,我们再来看看我们简约而不简单的HTTP服务器

var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(8124);

我们向 createServer 函数传递了一个匿名函数。

用这样的代码也可以达到同样的目的:

var http = require("http");

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

http.createServer(onRequest).listen(8124);
服务器是如何处理请求的

当回调启动,我们的onRequest()函数被触发的时候,有两个参数被传入,request 和 response。

它们是对象,可以使用它们的方法来处理HTTP请求的细节,并且响应请求(比如向发出请求的浏览器发回一些信息)。

上述代码中就是:当收到请求时,使用resp。writeHead()函数发送一个HTTP状态200 和HTTP头的内容类型(content-type),使用response.write()函数在HTTP相应主体中发送文本“Hello World”。

最后,我们调用 response.end() 完成响应。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值