如何在全局错误处理程序中捕获特定路由器请求的错误之前将其终止

时间:2019-11-24 11:11:39

标签: node.js express error-handling routes

所以我的路线像下面显示的那样排列

verifyToken中间件已在许多路由中使用。 通常,如果发生错误,我希望使用index.js的全局错误处理程序来处理它。

但是,如果在login.html路由正在通过方法= get使用verifyToken中间件时发生错误,我想 可以在routers / user.js内部处理它,我以为我可以使用router.get(/\/login(\.html)?$/, (error, req, res, next) => {}来完成,但是错误绕过了它并移至全局错误处理程序。

index.js

const userRouter = require('./routers/user')

app.get('', (req, res) => {
    res.render('index')
})

app.use(userRouter)

app.use((req, res, next) => {
    res.status(404).redirect('/404.html');
})

//Global error handling
app.use( (error, req, res, next) => {
 switch(error.name) {
        case "UnauthorizedError":
            console.log("UnauthorizedError = ", error.message)
            res.status(401).redirect('/401.html');
            break
        case "InternalServerError":
            console.log("InternalServerError = ", error.message)
            res.status(500).send('whatever')
            break
        default:
            console.log("Another error = ", error)
    }
})

/routers/user.js

const verifyToken = require('../middleware/authentication/verifyToken')

router.get(/\/login(\.html)?$/, verifyToken, (req, res) => {
    // If he is already logged in redirect him to dashboard
    // This route works as expected
    res.redirect('/admin/dashboard.html')
});

router.get(/\/login(\.html)?$/, (error, req, res, next) => {
    // If error = Unauthorized
    // which means that he is not logged in proceed
    if(error.name === 'UnauthorizedError') res.render('login')
    // else pass error to global error handler (at index.js)
    else next(error)
});

module.exports = router

/middleware/authentication/verifyToken.js

const jwt = require('jsonwebtoken')
var createError = require('http-errors')

const verifyToken = async (req, res, next) => {
    try {
        // Do some stuff
        if (token_doesnt_exist) return next(createError(401, 'TOKEN NOT FOUND', {expose: false}))
        // Do some stuff
        next()
    } catch {
        next(createError(e.status, e.message, {expose: false}))
    }
})

module.exports = verifyToken

更新

我最终转型

router.get(/\/login(\.html)?$/, (error, req, res, next) => {}

router.use((error, req, res, next) => {}

我猜它是有效的,因为它只能捕获上述路线中的错误。 我不确定这是否是我真的很想看到替代方法的最佳方法。

const verifyToken = require('../middleware/authentication/verifyToken')

router.get(/\/login(\.html)?$/, verifyToken, (req, res) => {
    // If he is already logged in redirect him to dashboard
    // This route works as expected
    res.redirect('/admin/dashboard.html')
});

router.use((error, req, res, next) => {
    // If error = Unauthorized
    // which means that he is not logged in proceed
    if(error.name === 'UnauthorizedError') res.render('login')
    // else pass error to global error handler (at index.js)
    else next(error)
});

module.exports = router

1 个答案:

答案 0 :(得分:0)

由于您只想在该路径中捕获错误,因此可以在中间件本身中捕获错误:

const verifyToken = async (req, res, next) => {
   try {
      //middleware logic
   } catch(err) {
      //error handling logic
   }

也许不是超级优雅,但它可以工作。.

相关问题