用node.js搭建一個靜態資源站 html,js,css正確加載 跳轉也完美實現!

昨天買了一個服務器想着用來測試一些本身的項目,因爲是第一次建站,在tomcat,linux,node.js間想了很久。最終由於node搭建比較方便沒那麼麻煩就決定用node.js來搭建網站項目。javascript

搭建服務器也很簡單首先下載安裝node.js後,創建一個項目文件夾再在文件夾下建一個js文件可任意取名,這個文件對項目進行配置css

所有配置以下:html

"use strict";
//加載所須要的模塊
var http = require('http');
var url = require('url');
var fs = require('fs');
var path = require('path');
var cp = require('child_process');

//建立服務
var httpServer = http.createServer(processRequest);
// 這是端口號
var port = 80;

//指定一個監聽的接口
httpServer.listen(port, function() {
    console.log(`app is running at port:${port}`);
    console.log(`url: http://localhost:${port}`);
    cp.exec(`explorer http://localhost:${port}`, function () {
    });
});

//響應請求的函數
function processRequest (request, response) {
    //mime類型
    var mime = {
        "css": "text/css",
        "gif": "image/gif",
        "html": "text/html",
        "ico": "image/x-icon",
        "jpeg": "image/jpeg",
        "jpg": "image/jpeg",
        "js": "text/javascript",
        "json": "application/json",
        "pdf": "application/pdf",
        "png": "image/png",
        "svg": "image/svg+xml",
        "swf": "application/x-shockwave-flash",
        "tiff": "image/tiff",
        "txt": "text/plain",
        "wav": "audio/x-wav",
        "wma": "audio/x-ms-wma",
        "wmv": "video/x-ms-wmv",
        "xml": "text/xml"
    };
    
    //request裏面切出標識符字符串
    var requestUrl = request.url;
    //url模塊的parse方法 接受一個字符串,返回一個url對象,切出來路徑
    var pathName = url.parse(requestUrl).pathname;

    //對路徑解碼,防止中文亂碼
    var pathName = decodeURI(pathName);

    //解決301重定向問題,若是pathname沒以/結尾,而且沒有擴展名
    if (!pathName.endsWith('/') && path.extname(pathName) === '') {
        pathName += '/';
        var redirect = "http://" + request.headers.host + pathName;
        response.writeHead(301, {
            location: redirect
        });
        //response.end方法用來回應完成後關閉本次對話,也能夠寫入HTTP迴應的具體內容。
        response.end();
    }

    //獲取資源文件的絕對路徑
  /*  var filePath = path.resolve(__dirname + pathName);*/
   //__dirname是訪問項目靜態資源的路徑 個人項目靜態文件都在public下因此我寫public可根據本身項目路徑來配置哦
  var filePath = path.resolve("public" + pathName);
    console.log(filePath);
    //獲取對應文件的文檔類型
    //咱們經過path.extname來獲取文件的後綴名。因爲extname返回值包含」.」,因此經過slice方法來剔除掉」.」,
    //對於沒有後綴名的文件,咱們一概認爲是unknown。
    var ext = path.extname(pathName);
    ext = ext ? ext.slice(1) : 'unknown';

    //未知的類型一概用"text/plain"類型
    var contentType = mime[ext] || "text/plain";

    fs.stat(filePath, (err, stats) => {
        if (err) {
            response.writeHead(404, { "content-type": "text/html" });
            response.end("<h1>404</h1>");
        }
        //沒出錯 而且文件存在
        if (!err && stats.isFile()) {
            readFile(filePath, contentType);
        }
        //若是路徑是目錄
        if (!err && stats.isDirectory()) {
            var html = "<head><meta charset = 'utf-8'/></head><body><ul>";
            //讀取該路徑下文件
            fs.readdir(filePath, (err, files) => {
                if (err) {
                    console.log("讀取路徑失敗!");
                } else {
                    //作成一個連接表,方便用戶訪問
                    var flag = false;
                    for (var file of files) {
                        //若是在目錄下找到index.html,直接讀取這個文件
                        if (file === "index.html") {
                            readFile(filePath + (filePath[filePath.length-1]=='/' ? '' : '/') + 'index.html', "text/html");
                            flag = true;
                            break;
                        };
                        html += `<li><a href='${file}'>${file}</a></li>`;
                    }
                    if(!flag) {
                        html += '</ul></body>';
                        response.writeHead(200, { "content-type": "text/html" });
                        response.end(html);
                    }
                }
            });
        }

        //讀取文件的函數
        function readFile(filePath, contentType){
            response.writeHead(200, { "content-type": contentType });
            //創建流對象,讀文件
            var stream = fs.createReadStream(filePath);
            //錯誤處理
            stream.on('error', function() {
                response.writeHead(500, { "content-type": contentType });
                response.end("<h1>500 Server Error</h1>");
            });
            //讀取文件
            stream.pipe(response);
        }
    });
}

 

這個配置能夠對文件的類型,路徑進行解析。java

由於個人項目靜態資源都在public文件下因此這裏就寫成public。你們可根據本身項目路徑來配置node

   //這裏是是訪問項目靜態資源的路徑 個人項目靜態文件都在public下因此我寫public可根據本身項目路徑來配置
  var filePath = path.resolve("public" + pathName);

這裏設置的是端口號,能夠根據須要本身來更改linux

var port = 80;
//
指定一個監聽的接口 httpServer.listen(port, function() { console.log(`app is running at port:${port}`); console.log(`url: http://localhost:${port}`); cp.exec(`explorer http://localhost:${port}`, function () { });//這行代碼做用是項目運行成功後自動打開項目網頁不想要的話能夠去掉 });

而後直接啓動 node node.js項目就跑起來了,靜態文件所有正確加載了,跳轉連接也能夠用。訪問的話直接訪問域名或Ip名就能直接打開項目頁面了json

相關文章
相關標籤/搜索