当前位置: 首页 > news >正文

使用Node的http模块创建web服务,给客户端返回html页面时,css失效的根本原因(有助于理解http)

最近正在尝试使用node写后端,使用node创建http服务的时候,碰到了这样的一个问题:

这是我的源代码:

import { createServer } from 'http'
import { join, dirname, extname } from 'path'
import { fileURLToPath } from 'url'
import { readFile } from 'fs'
// 创建服务器
const server = createServer()
// 定义需要运行的js文件所在目录
const __dirname = dirname(fileURLToPath(import.meta.url))
// 根据文件后缀名获取对应的Content-Type值
// const getContentType = ( filePath ) => {
//     const ext = extname(filePath).toLowerCase()
//     switch( ext) {
//         case '.html': return 'text/html;charset=utf-8'
//         case '.js': return 'application/javascript;charset=utf-8'
//         case '.css': return 'text/css;charset=utf-8'
//     }
// }
server.on('request', ( req, res ) => {
    const url = req.url
    const fPath = join(__dirname, '../'+url)
    console.log(fPath)
    readFile(fPath, 'utf8', ( err, dataStr ) => {
        if( err ) {
            return res.end('404 Not Found')
        }
        res.setHeader('Content-Type', 'text/html;charset=utf-8')
        // res.setHeader('Content-Type', getContentType(fPath))
        res.end(dataStr)
    })
})

server.listen(80, () => {
    console.log('服务器启动成功')

})

这是我的静态文件目录

看起来没有什么问题,但是当我在浏览器地址输入http://localhost/clock/index.html,因为是80端口,所以可以省略端口号

可以发现css样式丢失

什么原因导致的呢?

我们来f12调试一下

可以看到确实是请求到了三个静态文件,其中index.html的Content-Type为

text/html;charset=utf-8,没什么问题。

但是style.css的Content-Type也为text/html;charset=utf-8

这就是原因所在,响应头部错误,浏览器就不会把它解析为样式表,从而导致样式失效。

同样,index.js亦如(但是index.js脚本没有失效)

那怎么解决呢?

我们只需要动态的根据文件后缀名设置Content-Type即可

修改后的代码

import { createServer } from 'http'
import { join, dirname, extname } from 'path'
import { fileURLToPath } from 'url'
import { readFile } from 'fs'
// 创建服务器
const server = createServer()
// 定义需要运行的js文件所在目录
const __dirname = dirname(fileURLToPath(import.meta.url))
// 根据文件后缀名获取对应的Content-Type值
const getContentType = ( filePath ) => {
    const ext = extname(filePath).toLowerCase()
    switch( ext) {
        case '.html': return 'text/html;charset=utf-8'
        case '.js': return 'application/javascript;charset=utf-8'
        case '.css': return 'text/css;charset=utf-8'
    }
}
server.on('request', ( req, res ) => {
    const url = req.url
    const fPath = join(__dirname, '../'+url)
    console.log(fPath)
    readFile(fPath, 'utf8', ( err, dataStr ) => {
        if( err ) {
            return res.end('404 Not Found')
        }
        // res.setHeader('Content-Type', 'text/html;charset=utf-8')
        res.setHeader('Content-Type', getContentType(fPath))
        res.end(dataStr)
    })
})

server.listen(80, () => {
    console.log('服务器启动成功')

})

这个时候,页面就正常了

打开调试工具,Content-Type正常了

相关文章:

  • 走路碎步营养补充贴士
  • 使用libwebsocket写一个server
  • 【AI】利用Azure AI的元数据过滤器提升 RAG 性能并增强向量搜索案例
  • 【备考记录】三种校验码
  • pop是什么的缩写?为什么Python用它表示删除元素?
  • 【统计学相关笔记】2. 多元正态的Cochran定理
  • iptables练习笔记20250315
  • 盖革管死区时间导致脉冲丢失分析
  • 3.9/Q2,Charls最新文章解读!
  • 苹果电脑杀毒软件CleanMyMac
  • Android 手机启动过程
  • [C++Qt] 槽函数收不到信号问题(信号的注册)
  • 当大模型训练遇上“双向飙车”:DeepSeek开源周 DualPipe解析指南
  • 数字化转型 - 数据驱动
  • 【干货】Docker 在自动化测试和性能测试中的应用
  • 3.15刷题
  • 剑指 Offer II 083. 没有重复元素集合的全排列
  • 支持本地部署人力资源系统:6款工具评测精选
  • golang time包和日期函数
  • ​​​​​​​大语言模型安全风险分析及相关解决方案
  • 历史缝隙里的人︱觑功名如画饼:盛世“做题家”的攀爬与坠落
  • 证监会副主席李明:近期将出台深化科创板、创业板改革政策措施
  • 《缶翁的世界》首发:看吴昌硕王一亭等湖州籍书画家的影响
  • 重庆城市轨道交通拟听证调价:公布两套票价方案,正征求意见
  • 玉林一河段出现十年最大洪水,一村民被冲走遇难
  • 被围观的“英之园”,谁建了潮汕天价违建?