处理不同的请求--设置content-type

2023-11-09

content-type的作用

在http协议中,content-type用来告诉对方本次传输的数据的类型是什么。

  • 请求头中设置content-type来告诉服务器,本次请求携带的数据是什么类型的

  • 响应头中设置content-type来告诉浏览器,本次返回的数据是什么类型的

通过使用res对象中的setHeader方法,我们可以设置content-type这个响应头。这个响应头的作用是告诉浏览器,本次响应的内容是什么格式的内容,以方便浏览器进行处理。

常见的几种文件类型及content-type 

这个我在之前写的博客内讲解了  想看详细的可以参考这里:

MIME types (IANA media types) - HTTP | MDNicon-default.png?t=L892https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types

 例如下面.如果读出来的是.html的文件,但是content-type设置为了css。则浏览器将不会当作是html页面来渲染了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        h1{
            text-align: center;
        }
    </style>
+    <link rel="stylesheet" href="./style.css">
</head>
<body>
    <h1>index.html</h1>
+    <img src="./1.png" alt="">
</body>
</html>

上面的加号表示这里的代码需要修改.

const http = require('http'); //http模块
const fs = require('fs');     //fs模块
const path = require('path'); //path模块
const app = http.createServer((req, res) => {
    const url = req.url // 获取本次请求的url
    console.log('用户请求的是',url)
    console.log(req)
    if(url === '/index.html') {
        // 读入index.html的内容,设置响应体
        fs.readFile('./static/index.html',(err,data)=>{
            res.setHeader('content-type', 'text/html;charset=utf8')
            console.log(data)
            res.end(data)
        })
    } else if(url === '/default.png'){
        // 读入 default.png 的内容,设置响应体
        fs.readFile('./static/default.png',(err,data)=>{
            // res.setHeader('content-type', 'text/css;charset=utf8')
            res.setHeader('content-type', 'image/png')
            console.log(data)
            res.end(data)
        })
    }else if(url === '/style.css'){
        // 读入 default.png 的内容,设置响应体
        fs.readFile('./static/style.css',(err,data)=>{
            res.setHeader('content-type', 'text/css;charset=utf8')
            res.end(data)
        })
    }else if(url === '/js/jquery.js'){
        // 读入 default.png 的内容,设置响应体
        fs.readFile('./static/js/jquery.js',(err,data)=>{
            res.setHeader('content-type', 'application/javascript;charset=utf8')
            console.log(data)
            res.end(data)
        })
    }else if(url === '/abc.jpg'){
        // 读入 default.png 的内容,设置响应体
        fs.readFile('./static/default.png',(err,data)=>{
            res.setHeader('content-type', 'image/png')
            console.log(data)
            res.end(data)
        })
    }else {
        res.statusCode = 404
        res.end('not found')
    }
})
//启动服务器,监听8082端口
app.listen(8082, () => {
  console.log('8082端口启动');
});

也可以使用策略模式,用对象来带入 ,就可以节省很多行代码,让你的代码写的又飒又亮

const http = require('http')
const path = require('path')
const fs = require('fs')

    // “策略模式”
    // .png --> 'image/png'
    // .html --> 'text/html;charset=utf8'
    // .js --> 'application/javascript;charset=utf8'
    // .css --> 'text/css;charset=utf8'
const obj = {
    ".png":"image/png",
    ".jpg":"image/jpg",
    ".html":"text/html;charset=utf8",
    ".js":"application/javascript;charset=utf8",
    ".css":"text/css;charset=utf8"
}
const server = http.createServer((req, res)=>{
    // 如果直接http://localhost:8085 ===> req.url 就是 /,这时,希望它去加载 /index.html
    const url = req.url === '/' ? '/index.html' : req.url

    // 如果 req.url 要访问的文件在public能找到,就读出来,返回
    const filePath = path.join(__dirname,'public', url)

    // console.log('要读取的文件地址是',filePath )
    fs.readFile(filePath,(err, data)=>{
        if(err){
            res.statusCode = 404
            res.end('not found')
        } else {
            // 获取后缀名
            const extName = path.extname(filePath)
            console.log('本次请求的资源', extName, filePath)

            // 设置响应头中的content-type
            // .png --> 'image/png'
            // .html --> 'text/html;charset=utf8'
            // .js --> 'application/javascript;charset=utf8'
            // .css --> 'text/css;charset=utf8'
            // if(extName === '.png') {
            //     res.setHeader('content-type', 'image/png')
            // } else if(extName === '.html') {
            //     res.setHeader('content-type', 'text/html;charset=utf8')
            // }else if(extName === '.js') {
            //     res.setHeader('content-type', 'application/javascript;charset=utf8')
            // }else if(extName === '.css') {
            //     res.setHeader('content-type', 'text/css;charset=utf8')
            // }
            if(obj[extName]) {
                res.setHeader('content-type', obj[extName])
            }
            res.end(data)
        }
    })
    // if(filePath存在){
    //     读出来,返回
    // } else{ 
    //     返回404
    // }
    // res.end(filePath)
})
server.listen(8085)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理不同的请求--设置content-type 的相关文章

  • (节点:20732)[DEP0018] DeprecationWarning:未处理的承诺拒绝已被弃用。未来在nodejs中

    我正在尝试在我的应用程序中生成确认链接 虽然它工作正常并且也生成链接 但是当我访问该链接时 它在 Chrome 控制台中显示 POST http localhost 3000 api auth confirmation 400 Bad Re
  • 有什么不同? .on“连接”与.on“连接”

    我很难理解以下之间的区别 io on connection function io on connect function 可能是一个相当原始的问题 但是我无法找到有关它的明确文档 很想了解其中的区别 这些是同一事物的不同名称 正如所写so
  • python 2.7 中的 HTTP 2 请求

    在 python 中向 HTTP 1 和 HTTP 2 发出请求有什么区别吗 我可以像这样在 python 中进行 HTTP 1 x 调用 url http someURL values param1 key param2 key2 dat
  • 在社交媒体上分享 Reactjs 链接时,react-helmet 中的元标记不显示

    我有一个在客户端运行reactjs的项目 在后端运行nodejs express 我实现了react helmet来更新索引之外的路线的标题和元标记 例如 用户查看帖子 viewpost q POSTID 然后客户做了一个GET reque
  • NodeJs读取JSON文件

    我正在使用 NodeJs 读取 json 文件 我的代码非常基本 var obj require sample json console log obj 0 Sample json 文件包含这样的字符串化 JSON sample good
  • IE8 和 9 上的 socket.io 问题

    Socket io 在除 IE8 和 9 之外的所有平台上都能完美运行 这是客户端要求 你们能帮忙解决这个问题吗 我一直在阅读所有类似的问题 但到目前为止我发现的大多数解决方案都无法解决 IE8 上的这个问题 这是结构 服务器端 var i
  • NodeJS CPU 一次飙升至 100%

    我有一个用 NodeJS 编写的 SOCKS5 代理服务器 我正在使用原生net and dgram打开 TCP 和 UDP 套接字的库 它可以正常工作大约 2 天 所有 CPU 的最大利用率约为 30 两天没有重新启动后 一个 CPU 峰
  • 无法使用 webpack 加载 Node 原生插件

    虽然我正在使用vue cli在生成 webpack 配置的示例代码中 没有任何特定于 vue 的内容 我像这样创建示例应用程序 vue init webpack webpack modules example 生成webpack base
  • 为什么我的 Mongoose 3.8.7 架构 getter 和 setter 被忽略?

    在使用 Node js Mongoose 和 MongoDB 时 我发现当我执行 findOne 查询时 我的 Mongoose 模式 getter 和 setter 不会触发 我发现一个旧线程表明 2 x 版本中的 getter 和 se
  • 服务器响应中的“连接:保持活动状态”

    我正在尝试建立从 Silverlight 应用程序到 Apache 服务器托管的 PHP 页面的 HTTP 持久连接 即无需为每个 HTTP 请求创建新的 TCP 连接 为此 我需要网络服务器发送其 HTTP 响应 并将 Connectio
  • 使用 TFS 2015 运行 Jest 单元测试

    有人尝试将 jest 单元测试与 TFS 2015 集成吗 我尝试使用 Chutzpah 测试适配器 https visualstudiogallery msdn microsoft com f8741f04 bae4 4900 81c7
  • 以异步方式执行 Express res.render

    我有一个 Nodejs 应用程序 其中res renderExpress 方法以阻塞方式花费大约 400 毫秒 我如何处理它以非阻塞方式执行 我的 apache 基准测试需要 12 秒来执行大约 30 个并发请求 我如何以更好的方式实施这一
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • Django HTTPS 和 HTTP 会话

    我使用 Django 1 1 1 和 ssl 重定向中间件 通过 HTTPS 创建的会话数据 身份验证等 在站点的 HTTP 部分中不可用 无需将整个站点设置为 HTTPS 即可使其可用的最佳方法是什么 这是设计使然 您无法轻易更改 当通过
  • 如何使用 python 的 http.client 准确读取一个响应块?

    Using http client在 Python 3 3 或任何其他内置 python HTTP 客户端库 中 如何一次读取一个分块 HTTP 响应一个 HTTP 块 我正在扩展现有的测试装置 使用 python 编写 http clie
  • Nodemailer发送日历事件并将其添加到谷歌日历

    我正在尝试使用 nodemailer 将日历事件发送到 Gmail 帐户 这是我的代码 let transporter nodemailer createTransport host smtp gmail com port 587 secu
  • Node.js Express 4.0 中的 res.render 回调参数的用途是什么?

    目的是什么res render回调参数 在什么情况下 由于模板已被指定为第一个参数 因此人们会想要使用这样的回调参数 这是文档中的代码 send the rendered view to the client res render inde
  • 函数不会等到 Promise 得到解决

    我正在开发一个简单的不和谐机器人 我正在尝试打印有关某个玩家的一些一般数据 我最近了解了 async await 并尝试将其实现到我的代码中 然而 它似乎不起作用 因为当我第一次触发此代码时 它会打印 null 但在后续触发时 它将打印正确
  • 使用 Express.js 和 NodeJS,您可以通过响应正文中的重定向发送 JSON

    我正在尝试通过 302 重定向发送 JSON 在 ExpressJS 中这可能吗 API 声明可以添加主体res json 例如 res json 302 name larry 在接收端 重定向的目的地 主体是空的 这是一些示例代码 发送应
  • 在 Nodejs 中,如何停止 FOR 循环直到 MongoDB 调用返回

    我正在研究下面的代码片段 我有一个名为 stuObjList 的 JSON 对象数组 我想循环遍历数组以查找具有特定标志集的特定 JSON 对象 然后进行数据库调用以检索更多数据 当然 FOR 循环不会等待数据库调用返回并到达 j leng

随机推荐

  • tensorflow代码运行报错Process finished with exit code -1073741819 (0xC0000005)解决方案

    今天运行了一个tensorflow python代码 导致出现Process finished with exit code 1073741819 0xC0000005 报错 本代码大概功能是查询ckpt模型内的结点信息 报错有很多种原因
  • 如何在现有Fabric网络上添加一个Org?

    如何在现有Fabric网络上添加一个Org 本指南基于IBM DeveloperWorks 使用简单的工具将组织添加到现有的Hyperledger Fabric区块链网络中 感谢Bhargav Perepa和Jason Yellick的出色
  • 子查询返回的值不止一个如何处理_从零学会SQL:复杂查询

    一 视图 视图作用 链接数据库与客户 查询时候表中存放的是临时数据 视图可以存放SQL查询语句 避免重复反复输入 降低工作量 SQL语句范例 create view 按性别汇总 性别 人数 as select 性别 count from s
  • 《区块链技术与应用》课堂笔记(五):比特币系统的实现原理

    区块链是一个去中心化的账本 比特币采用了 基于交易的账本模式 transaction based ledger 只记录了转账交易和铸币交易 并没有直接记录每个账户上有多少钱 如果想知道某个比特币账户上有多少钱 要通过交易记录来推算 UTXO
  • vivo 2020届校招在线编程笔试

    题目 运矿车 小v最近在玩一款挖矿的游戏 该游戏介绍如下 1 每次可以挖到多个矿石 每个矿石的重量都不一样 挖矿结束后需要通过一款平衡矿车运送下山 2 平衡矿车有左右2个车厢 中间只有1个车轮沿着导轨滑到山下 且矿车只有在2个车厢重量完全相
  • java实现输出1--100之间的质数

    输出1 100之间的质数 大于1 只能被1和本身整除的 再没有其他因数的数 迭代1 100 每个数都被小于它的数取余一遍 如果有一个为0 则跳出本次循环 都不为0则输出 public static void main String args
  • 学习笔记——Windows CMD设置为UTF-8编码

    Windows CMD设置为UTF 8编码 windows下的cmd的默认编码是GBK编码 有时可能造成乱码问题 下面是我找到的两种更换编码方式为UTF 8的方法 1 临时修改 1 先进入cmd命令窗口 快捷键win键 R 2 直接输入 c
  • LogStash 启动报错

    报错信息如下 exception gt LogStash ConfigLoadingError message gt The following config files contains non ascii characters but
  • Ubuntu搭建Nginx服务器

    Ubuntu搭建Nginx服务器 安装Nginx 配置文件 全局配置文件 子配置文件管理 sites availables和sites enabled default配置文件 启动 停止 重启Nginx 启动 停止 重启 查询 其他设置 自
  • macbookpro接口叫什么_【科普】什么是雷电接口?苹果电脑MACBOOK PRO有吗?

    刚接触笔记本的朋友不知道USB C口是什么 也不知道雷电接口 Thunderbolt 是什么 只知道MACBOOK PRO有雷电3接口 简单来说 雷电接口是USB TYPE C的替代模式 在此了解 什么是USB TYPE C 什么是雷电接口
  • 二叉树前中后层序遍历,迭代实现

    文章目录 前序遍历 代码 Python 代码 C 中序遍历 代码 Python 代码 C 后序遍历 代码 C 后序遍历 进阶写法 代码 Python 代码 C 层序遍历 代码 Python 代码 C 总结 上一篇文章介绍了二叉树的几种遍历方
  • 简历被pass,笔试被淘汰,还有什么办法能直通面试?

    互联网是目前的热门行业 越来越多的年轻人也是一心想要往上扑 1 互联网行业处于成长期 科技行业扶持力度大 未来整个行业的上升空间巨大 我们都知道 两个人同时出发 搭乘巨轮比乘坐小船更容易走的更快更远 互联网行业就是那搜巨轮 借力使力 越早上
  • C++数据结构X篇_09_C++实现队列的顺序存储与链式存储

    本篇参考C 实现队列的顺序存储与链式存储整理 先搞懂结构框架 后期根据视频利用c对内容实现 也可以对c有更高的提升 文章目录 1 顺序存储 2 链式存储 队列是一种特殊的数据存储结构 与栈不同的是其数据存储与访问顺序为先进先出 形式如下 下
  • linux 块设备 dm,[CentOS7]dm块设备删除

    报错 root node 3 dev lsblk lsblk dm 3 获取设备路径失败 lsblk dm 3 获取设备路径失败 查看映射信息并删除 root node 3 dev dmsetup ls ceph adb6548e 8602
  • 读取resource根目录下的配置文件---标准

    读取配置文件 fileName conf json public String getConf String fileName String content try jsonFile ResourceUtils getFile classp
  • 快速排序-递归与分治

    include
  • 服务器虚拟化和桌面虚拟化

    服务器虚拟化和桌面虚拟化依托的都是KVM架构 两者的底层的东西是一样的 只不过是人为的将这个底层系统二次开发成不同的系统版本 有些功能做了限制 有些做了优化 这样的好处是 不同的场景可以使用不同的虚拟化系统 更好的满足客户的需求和发挥不同系
  • 织梦搜索时因关键词标红而导致页面样式错乱的解决方法

    使用织梦默认的搜索功能时 发现搜索某一关键词时 搜索展示页面样式错乱了 经过排查 确定是关键词标红引起的 出现此问题的原因 织梦搜索页面会将搜索关键词进行标红 字体颜色改为红色 处理 在代码中体现出来就是将关键词文字替换为套上font标签的
  • 对华为路由器配置DHCP实现IP地址的自动分配

    目录 0 题目 1 首先按照题意建立如下拓扑图 并划分子网 2 为路由器AR1进行基础设置 1 将系统名称改为r1 2 设置超时时长为0 永不超时 3 为路由器AR1两个接口配置IP地址 1 GE 0 0 0 2 GE 0 0 1 3 检查
  • 处理不同的请求--设置content-type

    content type的作用 在http协议中 content type用来告诉对方本次传输的数据的类型是什么 在请求头中设置content type来告诉服务器 本次请求携带的数据是什么类型的 在响应头中设置content type来告