国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

nodejs一個(gè)簡單的文件服務(wù)器的創(chuàng)建方法

2019-11-19 09:22:11
字體:
供稿:網(wǎng)友

簡單的文件服務(wù)器

有時(shí)候,我們想讀取一些服務(wù)器上的文件,但是又不想寫太復(fù)雜的程序,可以考慮用nodejs,可以很簡單的寫出一個(gè)文件服務(wù)器

下面是我寫的一個(gè)簡單的文件服務(wù)器,附帶緩存功能,這是github鏈接,或者直接復(fù)制下面的代碼運(yùn)行即可,需要安裝mime的依賴

const port = 3004; // 端口號(hào)const http = require('http');const url = require('url');const fs = require('fs');const path = require('path');const mime = require('mime');const STATIC_FOLDER = 'public'; // 默認(rèn)讀取public文件夾下的文件const IS_OPEN_CACHE = true; // 是否開啟緩存功能const CACHE_TIME = 10;// 告訴瀏覽器多少時(shí)間內(nèi)可以不用請(qǐng)求服務(wù)器,單位:秒const server = http.createServer((req, res) => { const obj = url.parse(req.url); // 解析請(qǐng)求的url let pathname = obj.pathname; // 請(qǐng)求的路徑 if (pathname === '/') {  pathname = './index.html'; } const realPath = path.join(__dirname, STATIC_FOLDER, pathname); // 獲取物理路徑 // 獲取文件基本信息,包括大小,創(chuàng)建時(shí)間修改時(shí)間等信息 fs.stat(realPath, (err, stats) => {  let endFilePath = '', contentType = '';  if (err || stats.isDirectory()) {   // 報(bào)錯(cuò)了或者請(qǐng)求的路徑是文件夾,則返回404   res.writeHead(404, 'not found', {    'Content-Type': 'text/plain'   });   res.write(`the request ${pathname} is not found`);   res.end();  } else {   let ext = path.extname(realPath).slice(1); // 獲取文件拓展名   contentType = mime.getType(ext) || 'text/plain';   endFilePath = realPath;   if (!IS_OPEN_CACHE) {    // 未開啟緩存    let raw = fs.createReadStream(endFilePath);    res.writeHead(200, 'ok');    raw.pipe(res);   } else {    // 獲取文件最后修改時(shí)間,并把時(shí)間轉(zhuǎn)換成世界時(shí)間字符串    let lastModified = stats.mtime.toUTCString();    const ifModifiedSince = 'if-modified-since';    // 告訴瀏覽器在規(guī)定的什么時(shí)間內(nèi)可以不用請(qǐng)求服務(wù)器,直接使用瀏覽器緩存,不過貌似沒有生效,需要再學(xué)習(xí)一下為什么    let expires = new Date();    expires.setTime(expires.getTime() + CACHE_TIME * 1000);    res.setHeader("Expires", expires.toUTCString());    res.setHeader('Cache-Control', 'max-age=' + CACHE_TIME);    if (req.headers[ifModifiedSince] && lastModified === req.headers[ifModifiedSince]) {     // 請(qǐng)求頭里包含請(qǐng)求ifModifiedSince且文件沒有修改,則返回304     res.writeHead(304, 'Not Modified');     res.end();    } else {     // 返回頭Last-Modified為當(dāng)前請(qǐng)求文件的最后修改時(shí)間     res.setHeader('Last-Modified', lastModified);     // 返回文件     let raw = fs.createReadStream(endFilePath);     res.writeHead(200, 'ok');     raw.pipe(res);    }   }  } });});server.listen(port);console.log(`server is running at http://localhost:${port}`)

不過目前還有一點(diǎn)問題,服務(wù)器緩存返回304,還有修改文件后,再次請(qǐng)求會(huì)返回最新文件這個(gè)功能目前沒有問題,不過設(shè)置的Cache-Control和Expires后,在規(guī)定的時(shí)間內(nèi)還是會(huì)請(qǐng)求服務(wù)器,這個(gè)還需要再看一下怎么回事,要是有人了解的話可以告訴我一下,謝謝。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 三台县| 云安县| 绥中县| 句容市| 兴国县| 漳浦县| 文水县| 拉萨市| 辽源市| 阿城市| 老河口市| 搜索| 海门市| 修武县| 茂名市| 阿拉尔市| 定边县| 新田县| 潜山县| 马鞍山市| 乾安县| 双流县| 张北县| 湄潭县| 德州市| 冕宁县| 河东区| 宁陕县| 太保市| 德格县| 固镇县| 华阴市| 湾仔区| 平邑县| 莲花县| 望都县| 海盐县| 济源市| 罗甸县| 札达县| 九江市|