node使用http 模块搭建一个静态服务器

简介: node使用http 模块搭建一个静态服务器

页面结构如下:


20201205170744384.png


实现代码如下:
// 使用http模块实现静态资源服务器
const http = require('http');
const path = require('path');
const fs = require('fs');
const URL = require('url');
// 搭建静态资源服务器,需要自身创建一个服务器
const server = http.createServer(async (req, res) => {
    // 获取地址
    const url = req.url;
    const fileInfo = await getFileInfoByUrl(url);
    if (!fileInfo) {
        res.writeHead(404, {'Content-Type': 'text/plain'})
        res.write('THE RESOURCE NOT FOUND', 'utf-8');
    } else {
        res.writeHead(200)
        res.write(fileInfo,'utf-8');
    }
    // 结束
    res.end();
})
server.listen(9527);
server.on('listening', _ => {
    console.log('正在监听9527这个端口')
})
/**
 * 通过地址获取文件的信息
 * @param url {String} 文件的地址
 * @returns {Promise<Buffer>}
 */
async function getFileInfoByUrl(url) {
    const urlObj = URL.parse(url);
    const fileName = path.resolve(__dirname, 'public', urlObj.pathname.substr(1));
    // 判断文件是否存在
    const fileResult = await fileExits(fileName);
    // 如果文件不存在,分为两种情况,第一种是文件本身是不存在,第二种是文件是一个目录
    // 文件不存在,那么给他默认路径拼接设置为 public下面的index.html
    if (!fileResult) return null;
    else if (fileResult.isDirectory()) {
        // 如果是目录, 默认使用index.html
        const fileNameDir = path.resolve(__dirname, 'public',urlObj.pathname.substr(1), 'index.html');
        const dirRes = await fileExits(fileNameDir);
        if (!dirRes) return null;
        else {
            // 通过路径 读取文件内容,返回
            return await fs.promises.readFile(fileNameDir);
        }
    } else {
        // 通过路径 读取文件内容,返回
        return await fs.promises.readFile(fileName);
    }
}
/**
 * 通过文件名称读取文件流
 * @param fileName {String} 文件名称
 * @returns {ReadStream} 返回读取的文件字符串
 */
// function getFileStream(fileName) {
//     // 创建读取流
//     const cr = fs.createReadStream(fileName, {
//         flags: 'r',
//         autoClose: true,
//         highWaterMark: 64 * 1024 * 1024,
//         encoding: 'utf-8'
//     });
//     let contentStr = '';
//     // 开始读取文件
//     cr.on('data', chunk => {
//         contentStr += chunk.toString();
//     })
//    cr.on('close', () => {
//          console.log(contentStr,'contentStr')
//         return contentStr;
//     });
//     return  contentStr;
// }
/**
 * 判断文件是否存在
 * @param fileName {String} 文件名称
 * @returns {Promise<Stats> | null} 结果
 */
async function fileExits(fileName) {
    try {
        return await fs.promises.stat(fileName);
    } catch (e) {
        return null;
    }
}


效果如下:


20201205170508760.png


20201205170521693.png

20201205170537163.png



相关文章
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
806 18
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
767 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题。让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region无法split掉,处于不可用状态。
1604 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Hbase依赖的datanode日志中如果出现如下报错信息:DataXceiverjava.io.EOFException: INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in receiveBlock for block  解决办法:Hbase侧配置的dfs.socket.timeout值过小,与DataNode侧配置的 dfs.socket.timeout的配置不一致,将hbase和datanode的该配置调成大并一致。
1013 0
|
Web App开发 前端开发
|
Web App开发 Linux
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
内存是影响Linux性能的主要因素之一,内存资源的充足与否直接影响应用系统的使用性能。 free命令:监控Linux内存使用状况。
1451 0
|
Web App开发 前端开发 算法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
基于大数据的精准营销与应用场景 2015年08月11日 大数据 大数据营销时代来临营销学领域过去半个多世纪的发展让我们见证了从“以产品为中心”到“以客户为中心”的转变。
1159 0

热门文章

最新文章