美文网首页
构建应用的模块-基于HTTP服务器

构建应用的模块-基于HTTP服务器

作者: 安卓Boy | 来源:发表于2017-12-04 14:37 被阅读10次

    构建应用的模块

    基于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() 完成响应。

    相关文章

      网友评论

          本文标题:构建应用的模块-基于HTTP服务器

          本文链接:https://www.haomeiwen.com/subject/llkxixtx.html