【问题标题】:How to Throw custom Errors?如何抛出自定义错误?
【发布时间】:2021-05-16 14:53:14
【问题描述】:

我正在尝试使用passport-jwt 策略进行身份验证。

这是我的代码:-

router.post('/register', async (req, res) => {
    const { username, email } = req.body;
    try {
        const user = await User.findOne({ username });
        if (user) {
            throw new Error('User with same username already exists !!');
        }
        const newUser = new User({
            username,
            email
        })
        const salt = await bcrypt.genSalt(10);
        newUser.password = await bcrypt.hash(req.body.password, salt);
        const savedUser = await newUser.save();
        res.json({
            status: 200,
            'Content-Type': 'Application/Json',
            'message': `You have successfully regirstered yourself, ${savedUser.username}!`
        })
    } catch (err) {
        err.statusCode = 500;
        console.log(err.message);
        res.header({
            status: '200',
            'Content-Type': 'Application/Json',
        });
        res.json(err);
    }
});

现在这条路线工作得很好,到目前为止它正在做所有事情。唯一的问题是,当我找到现有用户时,我想用自定义消息抛出一个新错误。 Javascript 有这个 Error 类,我可以用它来抛出这些错误。

当它捕获错误时会出现问题。当我console.log(err.message) 时,我可以完美地看到我的自定义消息。但是我通过res.json(err)返回的err对象没有任何message,而只有statusCode。

我想知道为什么会这样,解决办法是什么?现在,我正在做这样的事情:-

res.json({
    statusCode: 500,
    message : err.message
});

但我想返回填充了statusCode 和message 字段的err 对象。

【问题讨论】:

    标签: javascript node.js try-catch


    【解决方案1】:

    您可以创建自己的Error 类,它可以在构造函数中接受多个参数。这个类必须扩展基础Error JavaScript 类。例如:

    class MyCustomError extends Error {
      constructor(msg, statusCode) {
        super(msg);
        this.statusCode = statusCode;
        this.name = MyCustomError.name;
      }
    }
    
    function throwCustomError() {
      throw new MyCustomError('Some custom message', 404);
    }
    
    try {
      throwCustomError();
    } catch (error) {
      console.log(error.message);
      console.log(error.statusCode);
      console.dir(error);
    }

    请记住,如果要扩展另一个类,则必须在构造函数的开头调用 super

    【讨论】:

      【解决方案2】:

      您将错误对象传递给响应对象的 json 方法。但这仅将 JSON 可解析字符串作为参数。你可以做的是使用 -

      res.json(JSON.stringify(err))
      

      在您使用此响应的地方,您需要将此字符串解析为 JSON,然后将其转换为错误对象。假设您的前端也使用 javascript,您可以使用以下语法

      err = new Error(JSON.parse(response.data))
      

      【讨论】:

        【解决方案3】:

        用以下代码行替换整个 catch 块。

        res.status(500).json({
           message: err.message
        })
        

        【讨论】:

          【解决方案4】:

          来自documentation of res.json():此方法发送一个响应(具有正确的内容类型),该响应是使用 JSON.stringify() 转换为 JSON 字符串的参数。 现在运行JSON.stringify(new Error('custom msg')),我们得到"{}"

          【讨论】:

            猜你喜欢
            • 2021-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-15
            • 1970-01-01
            • 2020-10-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多