【问题标题】:how to write/throw errors in javascript web development?如何在 javascript Web 开发中编写/抛出错误?
【发布时间】:2021-07-06 23:39:17
【问题描述】:

我明白了,我们可以使用 try 和 catch 块来捕捉任何运行时错误,请参见下面的代码示例。 我是 async/await 编码范例的新手,但我假设,我如何捕获下面的错误没有问题。我假设,如果我想在用户为 null 时抛出错误,在下面的代码中,我该怎么做?这是一个自定义错误还是我可以做 - 如果我想在我的应用程序中捕获并重新抛出它到一些常见的错误处理函数/代码,我该怎么做?

伪代码

if (user == undefined or null)
   throw Error()
var express = require("express");
const models = require("../models");

router.get("/user/", async (req, res) => {
  try { 
 
    const user = await user.getUser();   
 
    res.status(200).send({ ...user.toJSON() });

  } catch (err) {

       res.status(400).send({ status: false, error: 'something went wrong' ) })
  }
});

【问题讨论】:

  • 在中间件 async (req, res, next) => { 中使用 next 然后在 catch 中使用它并让全局错误处理程序来处理它
  • @LawrenceCherone - 谢谢,我是 javascript/node web development 的新手。我假设下一个是另一个库,我可以下载。有没有例子或任何链接,你可以指点我吗?
  • 不,rtm error-handlingmiddleware,请参阅这个旧答案,显示示例:stackoverflow.com/questions/66847371/…
  • @LawrenceCherone - 谢谢

标签: javascript node.js


【解决方案1】:

我不认为控制器是抛出异常的最佳位置。您可以直接使用 http 错误代码进行响应。 通常,您在服务层或下面(例如在 getUser 函数中)来破坏逻辑,并假设它会在控制器中被捕获。在控制器中,您可以根据错误类型以不同的错误代码进行响应。 您可以通过制作一个中间件将您的错误映射到正确的 http 错误代码,在您的应用中全局执行该行为。

例如:在getUser中,如果user === null,则抛出NotFoundError(自定义错误扩展Error)。在中间件或控制器中,如果error是NotFoundError的实例,则返回404。

【讨论】:

【解决方案2】:

使用 express,您可以使用两个可选参数 nexterr,如果您了解 express 中间件函数,您就会知道要移动到中间件管道中的下一个函数,您可以使用 next()。很少有人知道您可以同时使用nexterr 来传递错误。

因此,使用您提供的 sn-p,您可以执行以下操作。

const express = require("express");
const models = require("../models");

router.get("/user/", async (err, req, res, next) => {
  try { 
    const user = await user.getUser();   

    if (!user) {
      // use of next and err, will throw error and not exucute
      // the rest of the function.
      return next(err)
    }

    res.status(200).send({ ...user.toJSON() });
  } catch (err) {
     res.status(400).send({ status: false, error: 'something went wrong' ) })
  }
});

我个人不喜欢使用上面展示的实现,因为让catch块中的响应来做工作要简单得多,但是如果你真的需要处理和报错,你可以使用这种方法。

【讨论】:

  • 谢谢,我刚刚重新开始阅读文档。谢谢,我不知道,next 用于将执行移动到中间件中的下一个函数。我的印象是它严格用于错误处理。那谢谢啦。所以“return next(err) 会将执行移到 catch 块?
猜你喜欢
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 2021-03-28
  • 1970-01-01
  • 2021-09-30
  • 2012-12-18
相关资源
最近更新 更多