node搭建服务器,静态文件实现服务器访问

"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 = 8080;

//指定一个监听的接口
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);
    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 Not Found</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);
        }
    });
}

转载的,不记得是哪里看的啦,如果原作者可联系我注明出处

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为了在本地搭建服务器来运行静态网页,你可以使用Express模块来构建一个简易的静态服务器。以下是一个简单的步骤: 1. 首先,你需要在你的项目文件夹下创建一个新的JavaScript文件,可以命名为server.js或其他你喜欢的名称。 2. 在server.js文件中,你需要引入Express模块,并创建一个Express应用程序实例。可以使用以下代码: ```javascript const express = require('express'); const app = express(); ``` 3. 然后,你需要指定你的静态文件的目录。假设你的静态文件都放在一个名为public的文件夹下,你可以使用以下代码将public文件夹设置为静态文件目录: ```javascript app.use(express.static('public')); ``` 4. 接着,你需要指定服务器监听的端口号。你可以使用以下代码指定一个端口号,比如3000: ```javascript const port = 3000; app.listen(port, () => { console.log(`服务器运行在 http://localhost:${port}`); }); ``` 5. 最后,在命令行中运行`node server.js`启动你的服务器。 6. 现在,你可以通过在浏览器中输入`http://localhost:3000`来访问你的静态网页了。如果你的入口文件是index.html,你可以直接访问`http://localhost:3000`;如果入口文件是其他名称的HTML文件,比如demo.html,你可以通过`http://localhost:3000/demo.html`来访问。 这样,你就可以通过本地搭建服务器来运行你的静态网页了。请注意,这只是一个简单的示例,你可以根据你的具体需求进行调整和扩展。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [nodejs构建本地web测试服务器 如何解决访问静态资源问题](https://download.csdn.net/download/weixin_38723516/14007532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [本地搭建简单服务器运行静态页面](https://blog.csdn.net/xilejie/article/details/131312678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值