nodeJs编写错误处理中间件问题

nodeJs编写错误处理中间件

app.use(async(ctx, next) => {
    try {
        await next();
    } catch (err) {
        console.log(err, "错误机制");
        ctx.status = err.status || err.statusCode;
        ctx.body = {
            message: err.message
        };
    }
})

koa-json-error 处理错误机制:

const koajsonerror = require("koa-json-error");
app.use(koajsonerror({
    postFormat: (err, { stack, ...rest }) => process.env.NODE_ENV === "production" ? rest : { stack, ...rest }
}));

温馨提示:放在最前面

Connect中间件之错误处理中间件

范例

var connect = require('connect');
connect()
        .use(errorHandler())
        .listen(3000);
 
/* 错误处理中间件函数必须接受四个参数:err, req, res和 next */
/* 而常规的中间件只有三个参数:req,res和next */
/* 当Connect遇到错误时,它只调用错误处理中间件 */
function errorHandler() {
        var env = process.env.NODE_ENV || 'development';
        return function(err, req, res, next) {
                res.statusCode = 500;
                switch (env) {
                        case 'development':
                                res.setHeader('Content-Type', 'application/json');
                                res.end(JSON.stringify(err));
                                break;
                        default:
                                res.end('Server error');
                }
        }
}

多个错误处理中间件组件

var connect = require('connect');
var api = connect()
        .use(users)
        .use(pets)
        .use(errorHandler);
var app = connect()
        .use(hello)
        .use('/api', api)
        .use(noPage)
        .use(errorPage)
        .listen(3000);
 
 
// hello 中间件组件
function hello(req, res, next) {
        if (req.url.match(/^\/hello/)) {
                res.end('Hello World\n');
        } else {
                next();
        }
}
 
// users 中间件组件
var db = {
        users: [
                {name: 'tobi'},
                {name: 'loki'},
                {name: 'jane'}
        ]
};
function users(req, res, next) {
        var match = req.url.match(/^\/user\/(.+)/);
        if (match) {
                var user = db.users[match[1]];
                if (user) {
                        res.setHeader('Content-Type', 'application/json');
                        res.end(JSON.stringify(user));
                } else {
                        var err = new Error('User not found');
                        err.notFound = true;
                        next(err);
                }
        } else {
                next();
        }
}
 
// pets 中间件组件
function pets(req, res, next) {
        if (req.url.match(/^\/pet\/(.+)/)) {
                foo();
        } else {
                next();
        }
}
 
// errorHandler 错误处理中间件组件
function errorHandler(err, req, res, next) {
        console.error(err.stack);
        res.setHeader('Content-Type', 'application/json');
        if (err.notFound) {
                res.statusCode = 404;
                res.end(JSON.stringify({error: err.message}));
        } else {
                res.statusCode = 500;
                res.end(JSON.stringify({error: 'Internal Server Error'}));
        }
}
 
// noPage 中间件组件
function noPage(req, res, next) {
        res.statusCode = 404;
        res.end('Not Found');
}
 
// errorPage 错误处理中间件组件
function errorPage(err, req, res, next) {
        res.end('Impossible');
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文地址:https://blog.csdn.net/weixin_45932157/article/details/123836504