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



相关文章
|
16天前
|
缓存 负载均衡 监控
HTTP代理服务器在网络安全中的重要性
随着科技和互联网的发展,HTTP代理IP中的代理服务器在企业业务中扮演重要角色。其主要作用包括:保护用户信息、访问控制、缓存内容、负载均衡、日志记录和协议转换,从而在网络管理、性能优化和安全性方面发挥关键作用。
51 2
|
1月前
|
机器学习/深度学习 JavaScript Cloud Native
Node.js作为一种快速、可扩展的服务器端运行时环境
Node.js作为一种快速、可扩展的服务器端运行时环境
47 8
|
2月前
|
JavaScript
使用Node.js创建一个简单的Web服务器
使用Node.js创建一个简单的Web服务器
|
2月前
|
JavaScript
使用node.js搭建一个express后端服务器
Express 是 Node.js 的一个库,用于搭建后端服务器。本文将指导你从零开始构建一个简易的 Express 服务器,包括项目初始化、代码编写、服务启动与项目结构优化。通过创建 handler 和 router 文件夹分离路由和处理逻辑,使项目更清晰易维护。最后,通过 Postman 测试确保服务正常运行。
97 1
|
2月前
|
缓存 负载均衡 监控
性能优化:Node.js高效服务器开发技巧与最佳实践
【10月更文挑战第29天】在Node.js服务器开发中,性能优化至关重要。本文介绍了几种高效开发的最佳实践,包括使用缓存策略、采用异步编程、实施负载均衡和性能监控。通过示例代码展示了如何实现这些技术,帮助开发者构建更快、更稳定的Node.js应用。
94 2
|
2月前
|
存储 Oracle 关系型数据库
oracle服务器存储过程中调用http
通过配置权限、创建和调用存储过程,您可以在Oracle数据库中使用UTL_HTTP包发起HTTP请求。这使得Oracle存储过程可以与外部HTTP服务进行交互,从而实现更复杂的数据处理和集成。在实际应用中,根据具体需求调整请求类型和错误处理逻辑,以确保系统的稳定性和可靠性。
87 0
|
3月前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API服务器
【10月更文挑战第12天】使用JavaScript和Node.js构建简单的RESTful API服务器
32 0
|
3月前
|
JavaScript 应用服务中间件 Apache
Node.js Web 模块
10月更文挑战第7天
36 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
TCP洪水攻击(SYN Flood)的诊断和处理 Posted by  海涛  on 2013 年 7 月 11 日 Tweet1 ​1. SYN Flood介绍 前段时间网站被攻击多次,其中最猛烈的就是TCP洪水攻击,即SYN Flood。
1013 0
|
Web App开发 前端开发 Java
<!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
线程的状态有:new、runnable、running、waiting、timed_waiting、blocked、dead 当执行new Thread(Runnabler)后,新创建出来的线程处于new状态,这种线程不可能执行 当执行thread.start()后,线程处于runnable状态,这种情况下只要得到CPU,就可以开始执行了。
738 0