通过Boom来处理错误的NodeJS。Chinese: 使用Boom来处理错误的NodeJS
哈皮/砰
安装
npm安装@hapi/boom
实施
require('dotenv').config()
const express = require('express')
const errorHandler = require('./helpers/error') // ←こちらを指定
// 省略
//
// エラー処理ミドルウェア
app.use(errorHandler)
const listener = app.listen(3000, function(){
logger.info('Listening on port ' + listener.address().port)
})
中间件处理
const boom = require('boom')
const config = require('../config/default')
const log4js = require("log4js");
const logger = log4js.getLogger("default");
const errorHandler = (err, req, res, next) => {
if (res.headersSent) return next(err)
if (!err.statusCode) err = boom.boomify(err)
if (err.hogehoge) { // 各分岐処理
// error
}
return
}
if (isMongodbErr(err)) { // mongoとかのエラー
logger.warn(req.userId, err.message)
res.status(500).json({message:err.message})
return
}
if (err.isServer) {
logger.error(req.userId, err)
res.status(500).json({message: '予期せぬエラーとか'})
return
// boom通した500番台のエラーはisServerでtrueが返る
}
err.isBoom ? logger.warn(req.userId, err.output.payload) : logger.error(req.userId, err)
return err.isBoom
? res.status(err.output.statusCode).json(err.output.payload)
: res.status(err.statusCode).json(err)
}
const isMongodbErr = (err) => {
return err.name === 'MongoServerSelectionError'
}
module.exports = errorHandler
操控方法
// モンゴDBからデータを取得する処理
router.get('/endpoint', async function (req, res, next) {
try {
// if (await cheackEndpoint(req.params.endpoint)) return next(Boom.badRequest('メッセージ')) //みたいにパラメーターチェックも可
const obj = { Name: { $eq: req.params.hogehoge } }
const result = await db.find(obj, 'ccc')
if (result.length === 0) return next(Boom.notFound('data not found')) //0件の場合エラーとしたい時など
res.json(result)
} catch (error) {
next(error) // try Catchに引っかかるとミドルウェアへnextされる
}
})
以下是客户将得到的回应。
{
"statusCode": 400,
"error": "Bad Request",
"message": "invalid query"
}
由于Boom默认提供了BadRequest和NotFound等模板,因此我们可以巧妙地利用它们。在这里,还可以设置要发送给客户端的消息,非常方便。