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

目录
  • nodeJs编写错误处理中间件
  • Connect中间件之错误处理中间件
    • 范例
    • 多个错误处理中间件组件

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');
}

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

(0)

相关推荐

  • Nodejs中Express 常用中间件 body-parser 实现解析

    写在前面 body-parser是非常常用的一个express中间件,作用是对post请求的请求体进行解析.使用非常简单,以下两行代码已经覆盖了大部分的使用场景. app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); 本文从简单的例子出发,探究body-parser的内部实现.至于body-parser如何使用,感兴趣的同学可以参考官方文档. 入门基础 在正式讲解前,我们先来看一个POST

  • nodejs关于中间件解析

    目录 nodejs 中间件 中间件的编写 中间件的使用 nodejs制作自定义中间件 总结 nodejs 中间件 今天我们来了解一下 nodejs 中间件,中间件可以说是 node 中最重要也是最核心的地方.它最重要的思想便是 洋葱模型 ,从外到内依次执行中间件. 说了半天中间件到底有什么作用呢,在处理服务请求时,我们要进行很多细节的处理,比如解析请求体,报文报头,设置 cookie 等等很多操作,如果每次访问路由都要编写这些繁琐的代码,将会造成代码混乱,你可能连自己的业务逻辑代码都找不到了.

  • Nodejs之Express中间件的分类介绍

    目录 中间件的分类 分别是 1 应用级别的中间件 2 路由级别的中间件 3 错误级别的中间件 4 Express内置的中间件 5 第三方中间件 总结 中间件的分类 为了方便大家理解和记忆中间件的使用,Express官方把常见的中间件用法,分成了5大类 分别是 应用级别的中间件 路由级别的中间件 错误级别的中间件 Express内置的中间件 第三方的中间件 1 应用级别的中间件 通过app.use()或app.get()或app.post(),绑定到app实例上的中间件,叫做应用级别的中间件,代码

  • NodeJs Express中间件超详细讲解

    目录 什么是中间件 现实生活中的例子 Express 中间件的调用流程 Express 中间件的格式 next 函数的作用 定义中间件函数 全局生效的中间件 定义全局中间件的简化形式 中间件的作用 定义多个全局中间件 局部生效的中间件 定义多个局部中间件 了解中间件的5个使用注意事项 中间件的分类 应用级别的中间件 路由级别的中间件 错误级别的中间件 Express内置的中间件 第三方的中间件 自定义中间件 1. 需求描述与实现步骤 2. 定义中间件 3 .监听req的data事件 4. 监听r

  • nodejs编写bash脚本的终极方案分享

    目录 前言 zx库 $`command` cd() fetch() question() sleep() nothrow() chalk fs os $.shell $.quote 传递环境变量 传递数组 总结 前言 最近在学习bash脚本语法,但是如果对bash语法不是熟手的话,感觉非常容易出错,比如说:显示未定义的变量shell中变量没有定义,仍然是可以使用的,但是它的结果可能不是你所预期的.举个例子: #!/bin/bash # 这里是判断变量var是否等于字符串abc,但是var这个变量

  • nodejs的错误处理过程记录

    本文以连接错误ECONNREFUSED为例,看看nodejs对错误处理的过程. 假设我们有以下代码 1. const net = require('net'); 2. net.connect({port: 9999}) 如果本机上没有监听9999端口,那么我们会得到以下输出. 1. events.js:170 2. throw er; // Unhandled 'error' event 3. ^ 4. 5. Error: connect ECONNREFUSED 127.0.0.1:9999

  • 深入理解nodejs中Express的中间件

    Express是一个基于Node.js平台的web应用开发框架,在Node.js基础之上扩展了web应用开发所需要的基础功能,从而使得我们开发Web应用更加方便.更加快捷. 举一个例子: 用node.js实现一个控制台打印"hello server" var http = require('http'); var server = http.createServer(function(req,res){ console.log("hello server"); })

  • 如何编写Go语言中间件的实例教程

    引言 web开发的背景下,"中间件"通常意思是"包装原始应用并添加一些额外的功能的应用的一部分".这个概念似乎总是不被人理解,但是我认为中间件非常棒. 首先,一个好的中间件有一个责任就是可插拔并且自足.这就意味着你可以在接口级别嵌入你的中间件他就能直接运行.它不会影响你编码方式,不是框架,仅仅是你请求处理里面的一层而已.完全没必要重写你的代码,如果你想使用中间件的一个功能,你就帮他插入到那里,如果不想使用了,就可以直接移除. 纵观Go语言,中间件是非常普遍的,即使在

  • nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error

    错误原因 在设置npm的cache和predix时,因为使用参考其他教程照抄,而没有修改为本机对应路径,本机上并没有这个地址,因此造成了错误. 教程代码: npm config set cache "D:\Develop\nodejs\node_global" npm config set prefix "D:\Develop\nodejs\node_cache" 结果就是输入与npm任何有关的命令时,都会报错: 错误代码文本形式: Error: UNKNOWN:

  • 详解在ASP.NET Core中如何编写合格的中间件

    这篇文章探讨了让不同的请求去使用不同的中间件,那么我们应该如何配置ASP.NET Core中间件?其实中间件只是在ASP.NET Core中处理Web请求的管道.所有ASP.NET Core应用程序至少需要一个中间件来响应请求,并且您的应用程序实际上只是中间件的集合.当然MVC管道本身就是中间件,早在WebForm时代就出现过HttpModules.HttpHandler.那个时候悠然记得我通过它们来组织我的广告系统,不闲扯我们继续. 每个中间件组件都有一个带有HttpContext参数的Inv

  • 在Python的Django框架中编写错误提示页面

    你应该在生产环境中把TEMPLATE_DEBUGFalse 如果这个设为`` True`` ,为了在那个好看的错误页面上显示足够的东西,Django的模版系统就会为每一个模版保存一些额外的信息. 实现一个404模板 如果`` DEBUG`` 设置为`` True`` ,Django会显示那个自带的404错误页面. 但如果`` DEBUG`` 被设置成`` False`` ,那它的行为就不一样了: 他会显示一个在你的模版根目录中名字叫`` 404.html`` 的模版 所以,当你准备部署你的应用时

  • 手把手教你如何使用nodejs编写cli命令行

    前端日常开发中,会遇见各种各样的cli,比如一行命令帮你打包的webpack,一行命令帮你生成vue项目模板的vue-cli,还有创建react项目的create-react-app等等等等.这些工具极大地方便了我们的日常工作,让计算机自己去干繁琐的工作,而我们,就可以节省出大量的时间用于学习.交流.开发. 逛steam . 但是有时候一些十分特别的需求,我们是找不到适合的cli工具去做的.比如说,你的项目十分庞大,你给项目添加一个新的路由,要经过 创建目录 -> 创建.vue文件 -> 更新

  • NodeJS开发人员常见五个错误理解

    Nodejs 诞生于 2009 年,由于它使用了 JavaScript ,在这些年里获得了非常广泛的流行.它是一个用于编写服务器端应用程序的 JavaScript 运行时,但是 "它就是JavaScript" 这句话并不是 100% 正确的. JavaScript 是单线程的,它不是被设计用来实现要求可伸缩性的服务器端上运行的.借助 Google Chrome 的高性能 V8 JavaScript 引擎, libuv 的超酷异步 I/O 实现以及其他一些刺激性的补充, Nodejs 能

随机推荐