ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
OK,就像我保证过的那样,我们现在可以回到我们如何组织应用这个问题上了。我们现在在 _server.js_ 文件中有一个非常基础的HTTP服务器代码,而且我提到通常我们会有一个叫 _index.js_ 的文件去调用应用的其他模块(比如 _server.js_ 中的HTTP服务器模块)来引导和启动应用。 我们现在就来谈谈怎么把server.js变成一个真正的Node.js模块,使它可以被我们(还没动工)的 _index.js_ 主文件使用。 也许你已经注意到,我们已经在代码中使用了模块了。像这样: ~~~ var http = require("http"); ... http.createServer(...); ~~~ Node.js中自带了一个叫做“http”的模块,我们在我们的代码中请求它并把返回值赋给一个本地变量。 这把我们的本地变量变成了一个拥有所有 _http_ 模块所提供的公共方法的对象。 给这种本地变量起一个和模块名称一样的名字是一种惯例,但是你也可以按照自己的喜好来: ~~~ var foo = require("http"); ... foo.createServer(...); ~~~ 很好,怎么使用Node.js内部模块已经很清楚了。我们怎么创建自己的模块,又怎么使用它呢? 等我们把 _server.js_ 变成一个真正的模块,你就能搞明白了。 事实上,我们不用做太多的修改。把某段代码变成模块意味着我们需要把我们希望提供其功能的部分 _导出_ 到请求这个模块的脚本。 目前,我们的HTTP服务器需要导出的功能非常简单,因为请求服务器模块的脚本仅仅是需要启动服务器而已。 我们把我们的服务器脚本放到一个叫做 _start_ 的函数里,然后我们会导出这个函数。 ~~~ var http = require("http"); function start() {  function onRequest(request, response) {     console.log("Request received.");     response.writeHead(200, {"Content-Type": "text/plain"});     response.write("Hello World");     response.end();  }   http.createServer(onRequest).listen(8888);   console.log("Server has started."); } exports.start = start; ~~~ 这样,我们现在就可以创建我们的主文件 _index.js_ 并在其中启动我们的HTTP了,虽然服务器的代码还在 _server.js_ 中。 创建 _index.js_ 文件并写入以下内容: ~~~ var server = require("./server"); server.start(); ~~~ 正如你所看到的,我们可以像使用任何其他的内置模块一样使用server模块:请求这个文件并把它指向一个变量,其中已导出的函数就可以被我们使用了。 好了。我们现在就可以从我们的主要脚本启动我们的的应用了,而它还是老样子: ~~~ node index.js ~~~ 非常好,我们现在可以把我们的应用的不同部分放入不同的文件里,并且通过生成模块的方式把它们连接到一起了。 我们仍然只拥有整个应用的最初部分:我们可以接收HTTP请求。但是我们得做点什么——对于不同的URL请求,服务器应该有不同的反应。 对于一个非常简单的应用来说,你可以直接在回调函数 _onRequest()_ 中做这件事情。不过就像我说过的,我们应该加入一些抽象的元素,让我们的例子变得更有趣一点儿。 处理不同的HTTP请求在我们的代码中是一个不同的部分,叫做“路由选择”——那么,我们接下来就创造一个叫做 _路由_ 的模块吧。