如何自定义 json- 服务器错误处理

How to customize json-server error handling

我想自定义我的 json- 服务器默认错误处理。

例如,如果我执行 POST 并且数据已经存在,我会收到 500 错误消息:

Error: Insert failed, duplicate id
    at Function.insert (<...>\node_modules\lodash-id\src\index.js:49:18)
    at <...>\node_modules\lodash\lodash.js:4388:28
    at arrayReduce (<...>\node_modules\lodash\lodash.js:683:21)
    at baseWrapperValue (<...>\node_modules\lodash\lodash.js:4387:14)
    at LodashWrapper.wrapperValue (<...>\node_modules\lodash\lodash.js:9050:14)
    at create (<...>\node_modules\json-server\lib\server\router\plural.js:235:48)
    at Layer.handle [as handle_request] (<...>\node_modules\express\lib\router\layer.js:95:5)
    at next (<...>\node_modules\express\lib\router\route.js:137:13)
    at next (<...>\node_modules\express\lib\router\route.js:131:14)
    at Route.dispatch (<...>\node_modules\express\lib\router\route.js:112:3)

相反,我想 return 409 冲突。

我试图覆盖 router.render,但在这种特定情况下未调用渲染。

我也试过添加全局错误处理程序,但没有被调用。

我找到的解决方案是手动删除默认错误处理程序。 https://github.com/typicode/json-server/blob/5c0331d1dc0caf72b81c211ca089b5e78a1c8826/src/server/router/index.js#L86

然后,添加一个新的错误处理程序工作:

router.stack = router.stack.filter(item => item.handle.length !== 4)

router.use((err, req, res, next) => {
  let status = 500;
  if (err.message === 'Insert failed, duplicate id') {
    status = 409
  }

  res.status(status).send({
    message: err.message
  })
})