发布于 2026-01-06 4 阅读
0

Lidando com 的爸爸们 inesperados em JavaScript AWS AI LIVE!

Lidando com dados inesperados em JavaScript

AWS AI 直播!

一些关于语言问题的重大问题是我们永远无法保证的,我们不能以“力”的方式来解决各种问题,例如,我们不能这样做。 A saída padrão que utilizamos quando temos estes casos é o simples teste:

function foo (mustExist) {
  if (!mustExist) throw new Error('Parameter cannot be null')
  return ...
}
Enter fullscreen mode Exit fullscreen mode

这是一个重大问题,是一项重大问题,需要在所有待办事项中进行各种测试,并且不能保证所有事项都能得到解决,最终实现所有待办事项的测试不同的参数或参数可能会导致后端和前端的参数undefined不同null,但这是一个大问题。

维桑多·梅尔霍拉尔(Pouco este cenário),以最小化“内行”的方式,将其作为梅尔霍斯战略的一部分。我完全同意 Eric Elliott 的观点。这是一个完整的想法,是关于 JavaScript 开发的节奏和体验的有趣信息。

之前,我们讨论了有关后端的问题,以及前端的主要问题。

问题的起源

这是不同字体的问题。一个主要的原因是,com certeza,o input do usuário。 Porém,存在于错误形式之外,além das que foram citadas no artigo:

  • Registros de bancos de dados
  • 隐式返回的功能
  • 外部API

Vamos ter um tratamento para cada tipo de caso que pegarmos and vamos passar por todos eles a frente, lembrando que nada é uma bala de prata.人类错误的根源在于,作为为激光雷达做好准备的语言,我们必须要为激光雷达做好准备,但也不能定义任何变化,因为它们是为激光雷达做好准备的。

用户输入

另一个问题是,我们的输入有问题,激光雷达的输入方式是Hydration (ou hidratação) 的说明,或者是,我们的输入方式是 envia,例如,em um 有效负载 de uma api, e 转换器ele em algo que possamos trabalhar sem 错误。

没有后端,完全可以使用 Express 的网络服务器,可以通过使用 vindos 的输入来实现待办事项或处理前端数据,例如JSON 架构或使用Joi

一些使用 Express 和 AJV 系列或后续操作的示例:

const Ajv = require('ajv')
const Express = require('express')
const bodyParser = require('body-parser')

const app = Express()
const ajv = new Ajv()

app.use(bodyParser.json())

app.get('/foo', (req, res) => {
  const schema = {
    type: 'object',
    properties: {
      name: { type: 'string' },
      password: { type: 'string' },
      email: { type: 'string', format: 'email' }
    },
    additionalProperties: false
    required: ['name', 'password', 'email']
  }

  const valid = ajv.validate(schema, req.body)
    if (!valid) return res.status(422).json(ajv.errors)
    // ...
})

app.listen(3000)
Enter fullscreen mode Exit fullscreen mode

验证有效负载的主体、有效负载的对象、有效负载的属性、嵌套的传递或body-parserJSON模式的消息属性、不同类型或格式的属性不同(没有电子邮件)。

重要提示: HTTP 422 表示不可处理实体。如果请求出错,正文或查询字符串出错,错误为 400 错误请求,但没有完全错误,但可能会出现问题,因为请求可能会出现错误。收到 422 号通知后,我们将向您提供有关请求的信息,以便我们为您提供帮助。

除了 AJV 之外,我们还可以使用与Roz和Expresso结合的图书馆库,并与Expresso的图书馆结合使用,以加快使用 Express 的 API 的开发速度。我们使用@expresso/validator来了解最前面的基本信息,然后通过中间件进行操作。

参数选项 com 值默认值

在前面的验证中,您可以选择在环境中选择的应用程序。例如,想象一下分页轮播参数:例如page查询size字符串。 Mas eles não são obrigatórios e, se não reebidos, devem assumir um valor padrão。

理想的情况是,我们的控制器可以提供以下功能:

function searchSomething (filter, page = 1, size = 10) {
  // ...
}
Enter fullscreen mode Exit fullscreen mode

注意:请参阅 422 条前面的retornamos,第 206部分内容。始终要求 cuja quantidade de bados retornados seja somente uma parte de um todo, vamos retornar como 206, quando a ultima página for acessada pelo usuário e não houver mais bados além destes, podemos retornar 200 e, se o usuário tentar 巴士车页面总数已达到范围,返回 204 No Content or então (até melhor) um 416 Request Range Not Satisfiable

这是一个解决问题的方法,它可以解决所有关于 JavaScript 的争议,但也可能会引起争议。 Os parâmetros opcionais so obtém seu valor default se, e somente se, ele for vazio, porém isto não funciona para o null, então se fizermos este teste:

function foo (a = 10) {
  console.log(a)
}

foo(undefined) // 10
foo(20) // 20
foo(null) // null
Enter fullscreen mode Exit fullscreen mode

请注意,请参阅有关选项参数或信息处理的一些信息null。 Então, para estes casos podemos fazer de duas formas:

  1. Tratamos diretemente 无控制器
function searchSomething (filter, page = 1, size = 10) {
  if (!page) page = 1
  if (!size) size = 10
  // ...
}
Enter fullscreen mode Exit fullscreen mode

O que não é muito bonito.

  1. Tratamos na rota,com JSON-Schema

Novamente podemos recorrer ao AJV ou ao @expresso/validator para poder tratar estes bados para nós

app.get('/foo', (req, res) => {
  const schema = {
    type: 'object',
    properties: {
      page: { type: 'number', default: 1 },
      size: { type: 'number', default: 10 },
    },
    additionalProperties: false
  }

  const valid = ajv.validate(schema, req.params)
    if (!valid) return res.status(422).json(ajv.errors)
    // ...
})
Enter fullscreen mode Exit fullscreen mode

Lidando com Null e Undefined

无论如何,JavaScript 的使用最重要的是它的价值,无论出于何种动机,它都可能是复杂的抽象概念、选项的参数。 Se você ainda tem dúvidas sobre os conceitos, uma grande explicação prática seria a imagem a seguir:

大家都知道,JavaScript 与 2020 年的双重功能相结合。 O空合并运算符eo可选链接。如果您想了解更多信息,可以通过以下方式轻松实现所有功能:nulle undefinedcom um operador próprio, o ??, ao invés de termos que utilizar as negações booleanas但是!obj,可能会出现各种错误。

隐含的功能

这个问题可能是一个复杂的解决方案,因为它是隐含的。 Algumas funções tratam bados assumindo que os mesmos semper serão preenchidos, porém em alguns casos isto pode não ser verdade, vamos pegar um exemplo classic:

function foo (num) {
  return 23*num
}
Enter fullscreen mode Exit fullscreen mode

Se numfor null, o resultado desta função será 0. O que pode não ser esperado。嵌套 casos não temos muito o que fazer a não ser testar o codigo。 Podemos realizar duas formas de teste, a primeira seria o simples if:

function foo (num) {
    if (!num) throw new Error('Error')
  return 23*num
}
Enter fullscreen mode Exit fullscreen mode

第二个形式是使用 Monad chamado或者,没有明确的说明,或者是一个模棱两可的形式,或者是,但现在还是没有。 JavaScript 可以支持 Promise 的变化。

function exists (value) {
  return x != null ? Promise.resolve(value) : Promise.reject(`Invalid value: ${value}`)
}

async function foo (num) {
  return exists(num).then(v => 23 * v)
}
Enter fullscreen mode Exit fullscreen mode

Desta forma podemos delegar o catchde existspara a função que chamou a função foo:

function init (n) {
  foo(n)
    .then(console.log)
    .catch(console.error)
}

init(12) // 276
init(null) // Invalid value: null
Enter fullscreen mode Exit fullscreen mode

银行登记处和外部 API

我们的主要职责是在银行和民众的银行中开展活动。例如,我们的新产品利用了之前的成功产品的基础,集成了不同系统之间的功能。

这是一个重大问题,银行无法解决这个问题,这是一个原因,但银行无法解决这个问题,我们无法解决任何问题。嗯,这是一个多文件的结尾,银行的文件中没有关于满足和解决问题的文件,也解决了前面的问题。

Não ha muito o que fugir neste caso, eu, pessoalmente, prefiro testar se o bado está de uma forma que eu não poderei utilizar.无论如何,所有这些事情都是如此,我们将把所有的物品都放在简单的大房间里。我们始终以实际行动验证您的想法,以实现算法的功能,例如,您map甚至filter无法确定实现操作的前提。

归还错误

通过断言函数的实用性和外部 API 的断言功能,基本功能可以返回或存在,但可能存在错误或不存在。我们可以使用 API 参数,例如,buscar 算法可以通过 ID 来实现findById

async function findById (id) {
  if (!id) throw new InvalidIDError(id)

  const result = await entityRepository.findById(id)
  if (!result) throw new EntityNotFoundError(id)
  return result
}
Enter fullscreen mode Exit fullscreen mode

替代Entitypelo nome da sua entidade,例如,UserNotFoundError

这是我的意思,是我的消息控制器,它的功能,例如,在 ID 中使用的功能,是在巴士外的总线上使用的额外功能,digamos,在外部底座上的使用效果。充分利用公共汽车的功能,可以保证银行不存在任何实际情况,也可以相反地执行公共汽车的功能,避免出现错误。

async function findUser (id) {
  if (!id) throw new InvalidIDError(id)

  const result = await userRepository.findById(id)
  if (!result) throw new UserNotFoundError(id)
  return result
}

async function findUserProfiles (userId) {
  const user = await findUser(userId)

  const profile = await profileRepository.findById(user.profileId)
  if (!profile) throw new ProfileNotFoundError(user.profileId)
  return profile
}
Enter fullscreen mode Exit fullscreen mode

如果您不执行任何银行的操作,则无法保证其存在。 Agora na rota Podemos fazer algo do tipo:

app.get('/users/{id}/profiles', handler)

// --- //

async function handler (req, res) {
  try {
    const userId = req.params.id
    const profile = await userService.getProfile(userId)
    return res.status(200).json(profile)
  } catch (e) {
    if (e instanceof UserNotFoundError || e instanceof ProfileNotFoundError) return res.status(404).json(e.message)
    if (e instanceof InvalidIDError) return res.status(400).json(e.message)
  }
}
Enter fullscreen mode Exit fullscreen mode

Podemos saber qual tito de erro retornar somente com o nome da instancia da classe erro que temos。

结论

存在多种形式的 Podermos tratar os nossos bads para que tenhamos um Fluxo continuo 和 previsível de informações。 Você conhece alguma outra dica?! Deixa ela aqui nos commentários :D

您可以继续阅读我的博客添加新闻通讯来接收最新消息!

文章来源:https://dev.to/_staticvoid/lidando-com-dados-inesperados-em-javascript-1n2i