gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:44:01 33 4
gpt4 key购买 nike

所以我的路线像下面所示排序

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) => {}
我猜这是有效的,因为它只能捕获上述 route 的错误。
我不确定这是否是我真的很想看到替代方法的最好方法。
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

最佳答案

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

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

也许不是 super 优雅,但它可以工作。

关于node.js - 如何在全局错误处理程序中捕获特定路由器请求的错误之前将其终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59017038/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com