我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript怎么安全的进行数据获取

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript怎么安全的进行数据获取

这篇文章主要讲解了“JavaScript怎么安全的进行数据获取”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript怎么安全的进行数据获取”吧!

获取数据的方式

fetch可能是我们在 JavaScript 获取数据最常见的方式。

但是,我们用fetch获取数据的的代码很有可能存在安全问题:

代码示例:

const res = await fetch('/user')const user = await res.json()

上面这段代码虽然简单好用,但存在许很多问题。

  • 问题一、缺少“错误处理”

当然你可能会说这个问题很好解决嘛,给她添加一个try/catch就好了,遇到错误就会抛出了嘛!

代码示例:

try {  const res = await fetch('/user')  const user = await res.json()} catch (err) {  // 处理错误的代码}

当然,这样可以确实可以对我们的错误进行处理了。遇到错误的时候也会抛出,但是就算这样写了还是存在很多的问题,对错误的覆盖能力不全面。

  • 问题二:无法识别部分错误代码

在这里,我们假设user实际上是一个用户对象。我们假设我们得到了响应200

但是fetch不会针对非 200 的状态抛出错误,因此如果你收到了400(错误请求)、401(未授权)、404(未找到)、500(内部服务器错误)或各种其他问题都不会进行错误抛出。

那你可能有会说了那我们用个if进行判断然后对不同的错误码进行分类处理不就好了!

于是我们就有了下面的代码

try {  const res = await fetch('/user')  if (!res.ok) {    switch (res.status) {      case 400:  break      case 401:  break      case 404:  break      case 500:  break    }  }  // User 已经是我们最新的数据了  const user = await res.json()} catch (err) {  // 错误处理}

现在,我们算是基本实现了fetch对数据的安全获取了. 但是这样写是很臃肿且笨重的,因为每次都必须重写写一次错误的处理逻辑,而如果是团队开发的话对每个成员的要求会更高,要求每个同事都要按照同样的逻辑来处理请求。而且在可读性方面,也是很差的,维护起来很麻烦。

那么我们可不可以换一种更优雅的方式来处理我们的逻辑代码呢?

更优雅的方式

我们可以使用throw来处理我们的不同的错误响,而不是使用switch/case.

try {  const res = await fetch('/user')  if (!res.ok) {    throw new Error('错误的响应')  }  const user = await res.json()} catch (err) {  // 错误处理}

但是我们还剩下最后一个问题——就是当我们需要处理错误时,我们丢失了很多有用的上下文。我们无法在 catch 块中访问,因此查看处理错误时我们上并不知道响应的状态代码或错误的详细信息。

这会让我们debug变的很困难,很难去查错。那我们要怎么才能拿到error的上下文呢?

最好的方法可能是创建我们自己的自定义错误类,并且在错误类中转发响应的详细信息:

代码:

class ResponseError extends Error {  constructor(message, res) {    super(message)    this.response = res  }}try {  const res = await fetch('/user')  if (!res.ok) {    throw new ResponseError('错误的响应信息(error的上下文信息)', res)  }  const user = await res.json()} catch (err) {  //我们可以拿到错误的详细信息,也就是error的上下文  switch (err.response.status) {    case 400:  break    case 401:  break    case 404:  break    case 500:  break  }}

现在我们保留状态代码等error信息,这样可以让我们的用户了解错误的原因的也能让我们更好的处理错误。

例如,我们可以提醒用户500我们遇到了问题,并可以让客户联系我们的进行解决。

或者如果状态为401,则他们当前未授权,可能需要重新登录等。

封装类

虽然上面的代码可以解决我们的所有问题,但是它仍然存在一个不稳定性,就是代码的健壮性取决于开发人员的个人素质和能力。我们的的请求安全并不能等到统一的保障。

我们可以对我们代码进行封装,然后使用时进行导出引用就行了

class ResponseError extends Error {  constructor(message, res) {    this.response = res  }}export async function myFetch(...options) {  const res = await fetch(...options)  if (!res.ok) {    throw new ResponseError('错误响应的信息', res)  }  return res}

然后我们可以按下面的方式去使用它:

try {  const res = await myFetch('/user')  const user = await res.json()} catch (err) {  // 错误的处理代码}

在我们的封装代码中,最好确保有一个统一的方式来处理错误。因为这里面包括给用户的警报、日志记录等。

开源的解决方案

当然如果我们的水平还没有达到可以自己封装一个完善的请求类时我们也可以去网上使用一些别封装好的请求类,

axios

  • axios是一个非常流行的 JS 请求数据的库,它已经帮我们解决了上面我们探讨的几个问题。

try {  const { data } = await axios.get('/user')} catch (err) {  // 错误处理代码}

我觉得 Axios 的唯一缺点是包太大,如果我们只是在一个项目获取一个很简单的数据时使用axios需要引入一个11kb的包,,反而会使我们的项目变的臃肿。

Redaxios

如果你觉得项目的大小对你更重要是你可以选择Redaxios

  • Redaxios使用有 Axios 一样的 API,但不到大小却不到[1kb]

import axios from 'redaxios'// use as you would normally

Wretch

还有一个不错的选项是Wretch,它是 Fetch封装成的一个非常小的包,和 Redaxios 一样。Wretch 的特别之处在于它在很大程度上还原了原生的数据请求方法,但是它帮我们封装了很多的错误处理代码。

const user = await wretch("/user")  .get()  // Handle error cases in a more human-readable way  .notFound(error => {  })  .unauthorized(error => {  })  .error(418, error => {  })  .res(response => )  .catch(error => {  })

感谢各位的阅读,以上就是“JavaScript怎么安全的进行数据获取”的内容了,经过本文的学习后,相信大家对JavaScript怎么安全的进行数据获取这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript怎么安全的进行数据获取

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript怎么安全的进行数据获取

这篇文章主要讲解了“JavaScript怎么安全的进行数据获取”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript怎么安全的进行数据获取”吧!获取数据的方式fetch可能是我们
2023-07-05

一文详解JavaScript如何安全的进行数据获取

这篇文章主要为大家介绍了JavaScript如何安全的进行数据获取方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-19

python怎么获取数据行列数

在Python中,可以使用numpy库来获取数据的行数和列数。下面是一个示例代码:```pythonimport numpy as np# 创建一个2维数组data = np.array([[1, 2, 3], [4, 5, 6], [7,
2023-09-27

sql怎么获取某一行的数据

要获取某一行的数据,可以使用SELECT语句并添加WHERE子句来指定条件,以获取特定行的数据。例如,以下是获取表中id为1的行的数据的示例SQL查询:SELECT * FROM table_name WHERE id = 1;在这个查询
sql怎么获取某一行的数据
2024-04-18

怎么进行Docker数据安全隐患分析

本篇文章为大家展示了怎么进行Docker数据安全隐患分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Docker容器为应用的编写、分发和部署带来真正翻天覆地的变化。容器的目的是灵活性,让应用可按需
2023-06-17

怎么使用datagrid获取行数据

要使用DataGrid获取行数据,可以按照以下步骤进行操作:1. 首先,获取到DataGrid控件的实例。可以通过代码获取或者在XAML文件中定义一个DataGrid控件,并设置一个给定的名称。2. 在需要获取行数据的地方,可以使用以下代码
2023-08-26

pb怎么获取数据窗口行数

要获取数据窗口行数,可以使用以下方法:使用dw_1.RowCount()函数获取数据窗口的行数,其中dw_1是数据窗口的名称。例如:int row_count = dw_1.RowCount();使用dw_1.Object.Data.Row
2023-10-27

gridview怎么获取选中行数据

要获取GridView中选中行的数据,可以通过以下步骤进行操作:1. 使用GridView的`SelectedRow`属性获取选中行的行索引。2. 使用GridView的`Rows`属性获取所有行的集合。3. 使用选中行的行索引,访问行集合
2023-08-26

怎么使用Pandas进行数据读取

本文小编为大家详细介绍“怎么使用Pandas进行数据读取”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Pandas进行数据读取”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。使用pandas进行数据读取,
2023-07-05

怎么获取mysql数据库里的数据

我们可以通过以下方法获取 mysql 数据:使用 mysql 命令行客户端连接数据库并使用 select 语句检索数据。使用 python 的 mysql connector/python 库进行连接和查询。使用 java 的 jdbc 连
怎么获取mysql数据库里的数据
2024-04-05

oracle怎么使用游标获取多行数据

在Oracle中使用游标获取多行数据的步骤如下:1. 声明游标:使用`DECLARE`语句来声明游标变量,并指定游标的名称和返回的数据类型。例如:```sqlDECLARECURSOR cursor_name ISSELECT column
2023-08-31

json数据怎么利用hibernate进行存取

这篇文章将为大家详细讲解有关json数据怎么利用hibernate进行存取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、场景public class OrderModel {privat
2023-05-31

java怎么获取jsonobject里的数据

在Java中,可以使用JSON库(如Gson、Jackson等)来解析和获取JSONObject里的数据。这里以Gson库为例,以下是一种常见的获取JSONObject数据的方法:1. 首先,导入Gson库的依赖。在Maven项目中,可以在
2023-09-12

java怎么获取输入的数据

在Java中,可以使用Scanner类来获取用户的输入数据。首先需要导入Scanner类:```javaimport java.util.Scanner;```然后可以创建一个Scanner对象来获取用户的输入数据:```javaScann
2023-08-17

PHP数据库怎样获取查询结果的行数

本篇内容介绍了“PHP数据库怎样获取查询结果的行数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在之前的学习中,我们已经了解怎样获取SQL的
2023-06-25

怎么获取listview选中的数据

要获取ListView选中的数据,可以通过以下步骤:1. 在布局文件中定义一个ListView控件,并设置适配器。2. 在代码中获取ListView控件的实例,并设置其选择模式为单选或多选。3. 使用setOnItemClickListen
2023-09-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录