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



相关文章
|
1月前
|
缓存 JavaScript 安全
nodejs里面的http模块介绍和使用
综上所述,Node.js的http模块是构建Web服务的基础,其灵活性和强大功能,结合Node.js异步非阻塞的特点,为现代Web应用开发提供了坚实的基础。
103 62
|
1月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
43 1
使用Netty实现文件传输的HTTP服务器和客户端
|
18天前
|
存储 Oracle 关系型数据库
oracle服务器存储过程中调用http
通过配置权限、创建和调用存储过程,您可以在Oracle数据库中使用UTL_HTTP包发起HTTP请求。这使得Oracle存储过程可以与外部HTTP服务进行交互,从而实现更复杂的数据处理和集成。在实际应用中,根据具体需求调整请求类型和错误处理逻辑,以确保系统的稳定性和可靠性。
20 0
|
2月前
|
前端开发 JavaScript
node反向代理,解决跨域(http-proxy-middleware)
使用node.js和http-proxy-middleware库实现反向代理,解决跨域问题,允许前端请求通过代理访问不同端口的服务。
106 3
|
1月前
|
JSON API 开发者
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
17 0
|
1月前
|
移动开发 网络协议 C语言
详解 httptools 模块,一个 HTTP 解析器
详解 httptools 模块,一个 HTTP 解析器
28 0
|
2月前
|
开发者
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
32 1
|
3月前
|
缓存 应用服务中间件 nginx
安装nginx-http-flv-module模块
本文介绍如何为Nginx安装`nginx-http-flv-module`模块。此模块基于`nginx-rtmp-module`二次开发,不仅具备原模块的所有功能,还支持HTTP-FLV播放、GOP缓存、虚拟主机等功能。安装步骤包括:确认Nginx版本、下载相应版本的Nginx与模块源码、重新编译Nginx并加入新模块、验证模块安装成功。特别注意,此模块已包含`nginx-rtmp-module`功能,无需重复编译安装。
170 1
|
3月前
|
移动开发 网络协议 编译器
实战案例3:C语言实现的HTTP服务器
实战案例3:C语言实现的HTTP服务器
190 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
1.尽可能地了解需求,系统层面适用开闭原则 2.模块化,低耦合,能快速响应变化,也可以避免一个子系统的问题波及整个大系统 3.
750 0
下一篇
无影云桌面