【问题标题】:throw error versus normal return in express快速抛出错误与正常返回
【发布时间】:2018-01-06 02:46:19
【问题描述】:

我知道如何使用 node.js (express) 编写简单的 API。但是现在我很困惑,无法区分这两个代码块

if(err){ return res.status(500).json(err) }
return res.json(result)

if(err) { throw new Error(err) }
return res.json(result)

API 响应的标准是什么?我只是返回 2 个属性,比如

if(err){ return res.json({ status: false, msg: 'user password is incorrect }) }
return ({ status: true, msg: result.token })

我的方法有什么问题,为什么我们应该使用 throw?

【问题讨论】:

    标签: javascript node.js api express


    【解决方案1】:

    您通常根本不想在 Express 中抛出错误,因为除非它被捕获,否则它会在不给用户警告的情况下使进程崩溃,并且很难捕获错误并维护请求上下文以否则这样做.

    相反,Express 处理程序中的选择应该是在直接返回错误响应(如您的示例中)和调用 next(err) 之间。在我的应用程序中,我总是使用后者,因为它可以让我设置错误处理中间件,以始终始终如一地处理各种问题案例。

    示例如下:

    app.get('/something', (req, res, next) => {
      // whatever database call or the like
      Something.find({ name: 'something'}, (err, thing) => {
         // some DB error, we don't know what. 
         if (err) return next(err);
         // No error, but thing wasn't found
         // In this case, I've defined a NotFoundError that extends Error and has a property called statusCode set to 404. 
         if (!thing) return next(new NotFoundError('Thing was not found'));
         return res.json(thing);
      });
    });
    

    然后是一些用于处理错误的中间件,如下所示:

    app.use((err, req, res, next) => {
      // log the error; normally I'd use debug.js or similar, but for simplicity just console in this example
      console.error(err);
    
      // Check to see if we have already defined the status code
      if (err.statusCode){
        // In production, you'd want to make sure that err.message is 'safe' for users to see, or else use a different value there
        return res.status(err.statusCode).json({ message: err.message }); 
      }
      return res.status(500).json({ message: 'An error has occurred, please contact the system administrator if it continues.' });
    });
    

    请注意,Express 中的几乎所有内容都是通过中间件完成的。

    【讨论】:

    • 你能显示一些代码吗?做 next(err) 会产生什么样的结果?我的大部分 api 都没有中间件,做 next(err) 还相关吗?
    • 我展示的那个? node 中的中间件只是一个处理函数。有时您可以通过使用模块来做到这一点,但您不必这样做。我写了 praeter (npmjs.com/package/praeter) 作为包装我提到的上述内容的一种方式,但是您可以使用自己的代码轻松完成。
    猜你喜欢
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2017-06-20
    • 2012-05-05
    相关资源
    最近更新 更多