Apache 伺服器軟體有一個預設功能,假如我們有一個資料夾結構如下:
1 | — server.js |
在 Apache 中,我們可以通過開啟本地網頁伺服器,並透過 127.0.0.1/index.html
訪問到 index.html,也可以透過 127.0.0.1/file/index.html
訪問到 index.html,另外如果在網址欄輸入不存在的路徑時,會有錯誤頁面。現在讓我們透過 Node.js 初步實現這個功能。
基本架構
server.js
1 | var http = require('http') |
設定 url 對應的檔案判斷
目前我們希望可以讓使用者透過網址直接訪問 www 資料夾內的資源,可以透過這樣來達成
1 | server.on('request', function (req, res) { |
接著把所有資源的判斷式都補上
1 | server.on('request', function (req, res) { |
優化 - 動態讀取
上面這樣的方式在伺服器資源越來越多時,每新增一個檔案就必須要寫一個判斷式,非常沒有效率。我們可以用更聰明的方式來達成一樣的效果。
我們可以將請求路徑
的根當作 www 資料夾,依據請求路徑到 www 資料夾找出相對應的檔案,例如請求路徑為 /AAA/B.html
,那我們就找找有沒有 www/AAA/B.html
的檔案,若有相應檔案就回應此檔案,若沒有就回應 404 頁面。
實現方式:
- 先將
./www
儲存在變數 wwwDir 中,所有資源將會以該資料夾為根目錄選找對應檔案 - 透過
wwwDir + 請求路徑
,就能抓到將對應的檔案1
2
3
4
5
6
7
8
9
10
11
12
13
14
15var wwwDir = './www'
server.on('request', function (req, res) {
var url = req.url
var filePath
// 在 Apache 中,當請求路徑為 / 時,預設回傳 index.html
url === '/' ? filePath = '/index.html' : filePath = url
fs.readFile(wwwDir + filePath, function (error, data) {
if (error) {
return res.end('404 Not Found.')
}
res.end(data)
})
})