【问题标题】:Express error handling pattern表达错误处理模式
【发布时间】:2017-10-29 16:29:03
【问题描述】:

我正在研究 Express 以创建一个简单的 JSON API,但我不确定如何组织我的输入参数验证和错误处理。错误可能源自验证步骤,也可能源自数据库访问步骤。这是我目前所拥有的:

router.use(function(req, res, next) {
    validate(req.query).then(function() {
        next()
    }).catch(function(e) {
        next(e)
    })
})

router.get("/", function(req, res, next) {
    someDatabaseAccess(req.query).then(function(results) {
        res.json(results)
    }).catch(function(e) {
        next(e)
    })
})

router.use(function(e, req, res, next) {

    // ... (handling specific errors)

    res.status(400)
    res.json(someDummyResponse(e))
})

验证如下所示:

const validate = function(q) {
    return new Promise(function(resolve, reject) {
        if (q.someParameter) {
            if (somethingWrong(q.someParameter)) {
                reject(new Error("Something wrong!"))
            }
        }
        resolve()
    })
}

这有意义吗?有什么我应该做的不同/不那么复杂的事情吗?

【问题讨论】:

    标签: javascript express ecmascript-6 es6-promise


    【解决方案1】:

    为了验证,我建议查看JSONSchema 工具。 例如,我使用包tv4 作为验证器,但有很多类似的。首先创建对象的模式:

    const tv4 = require('tv4');
    
    const schema = {
      type: object,
      properties: {
        name: string,
        phone: string
      },
      required: ['name']
    };
    

    然后在你的路线中,你这样做:

    app.post('/someroute', (req, res, next) => {
      if (!tv4.validate(req.body, schema) ) 
        return next( new Error('not valid input'));
      // do some cool stuff here
      res.end();
    });
    

    express 中的错误处理基本上是在最后一个中间件函数中添加一个中间件函数,并带有额外的参数:

    // add middleware
    app.use(bodyParser.json())
    
    // add custom middleware
    app.use(function(req, res, next) {
      // some cool stuff
      next();
    });    
    
    // add routes
    app.get('/', () => {})
    
    // error handler always last
    // Pay attention to additional `err` param
    app.use(function (err, req, res, next) {
      if (err) {
        // log error, whatever handling logic
      }
      else next();
    });
    

    【讨论】:

      【解决方案2】:

      更结构化的方法是拥有一个单独的错误配置文件并使用中间件抛出该错误,这样您的应用程序结构就会更好

      error.json

      "err":[
         "errorLog501":{
           "status":501,
           "message":"request is invalid"
          }
      ]
      

      `

      var errCodes = require('./error.json')
      var errMiddleware = function(req, res, next) {
         if (req.body.hello) {
         // some cool stuff
           res.json(errCodes.errorLog501)
         } else {
           next();
         }
      }
      
      app.use(errMiddleware); //everytime a request happens the middleware called
      

      在 JSON 响应中传递状态码非常重要,这样前端可以显示适当的错误消息并且用户可以知道应用程序的状态

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-16
        • 2017-10-26
        • 2021-10-09
        • 1970-01-01
        相关资源
        最近更新 更多