從頭編寫(xiě)一個(gè) HTTP 靜態(tài)資源服務(wù)器

首先需要的Node 模塊有 http,url,path,fs 模塊。

```

// 提供一個(gè)http 服務(wù)

var http = require('http');

// 用于處理 url 字符串和 url對(duì)象

var url = require('url');

// 用于處理文件路徑

var path = require('path');

// fs 模塊? 用于讀取文件的

var fs = require('fs');

```

然后要用 http模塊來(lái)創(chuàng)建一個(gè)http模塊。

```

http.createServer(function(request,response){

? //

})

```

當(dāng)一個(gè)http 請(qǐng)求過(guò)來(lái)的時(shí)候,需要解析request.url 字段,利用url.parse()將request.url 字符串轉(zhuǎn)義成url 對(duì)象。

```

var pathName = url.parse(request.url).pathname;

```

這里假設(shè)的是把js文件所在的目錄作為靜態(tài)服務(wù)器的地址。

```

var realName = path.join('.', pathName);

```

然獲取到請(qǐng)求資源的文件類(lèi)型

```

var ext = path.extname(pathName);

ext = ext ? ext.slice(1) : 'unknown';

```

然后判斷文件是否存在,如果存在,則返回文件,否者返回404

```

// 判斷文件是否存在。

fs.exists(realName, function (exists) {

})

```

如果不存在

```

if (!exists) {

? response.writeHead(404, {'Context-type' : 'text/plain'});

? response.write('this request url' + pathName + ' was not found on this server.');

? response.end();

}

```

如果文件存在,則讀取文件的二進(jìn)制流

```

var requestType = {

? ? "css" : "text/css",

? ? "js" : "text/javascript",

? ? "html":"text/html"

};

fs.readFile(realName, 'binary', function (err, file) {

? ? if (err) {

? ? ? ? response.writeHead(500, {'Context-type' : 'text/plain'});

? ? ? response.end(err);

? ? }

? ? else {

? ? ? ? ? var contentType = requestType[ext] || "text/plain";

? ? ? ? ? response.writeHead(200, {'Context-type' : contentType});

? ? ? ? ? response.write(file, 'binary');

? ? ? ? ? response.end();

? ? }

});

```

這樣,一個(gè)簡(jiǎn)單的HTTP 靜態(tài)資源服務(wù)器就寫(xiě)好了。

貼上項(xiàng)目地址:https://github.com/bosscheng/simple-http-server

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容