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請求在我們的代碼中是一個不同的部分,叫做“路由選擇”——那么,我們接下來就創造一個叫做?_路由_?的模塊吧。