http://expressjs.com/zh-cn/guide/error-handling.html
示例:
使用Express 框架use方法添加错误处理句柄error handler
// error handler; 处理所有错误 app.use(function (err, req, res, next) { console.log('err :' + err + ' err.status :' + err.status); res.status(err.status || 500); // 响应状态码如果没有响应500 // 判断状态码显示404错误页面 if (err.status === 404) { res.render('error/error404'); } else { res.render('error', { message: err.message, error: { status: err.status, stack: err.stack, }, }); }
创建404资源找不到错误,通过next方法交给error handler处理
var createError = require('http-errors'); // catch 404 and forward to error handler app.use(function (req, res, next) { next(createError(404)); // 创建404资源找不到错误,next方法交给error handler处理 });
同步异常测试 /test1
userRouter.get('/test1', function (req, res) { throw new Error('请求出错'); });
上述代处理同步异常没问题但在处理异步异常时,error handler不能捕获异步异常
异步异常处理方式一:使用next函数,将错误信息交给error handler
例如:
userRouter.get('/find', function (req, res, next) { var sql = 'SELECT id,username,password FROM user WHERE ids = ?'; var parameters = [12]; db.query(sql, parameters, function (err, data) { if (err) { //throw new Error('请求出错'); //异步异常,throw子句无法处理 return next(err); // 交异常交给错误处理句柄 error handler } res.send(data[0]); }); });
Promise机制
https://www.cnblogs.com/superAnny/p/7622862.html
一、为什么要学习promise? Javascript是一种单线程的语言, 所有的代码必须按照所谓的“ 自上而下” 的顺序来执行。 本特性带来的问题, 在处理耗时操作时, 程序会阻塞, 这时需要使用异步编程; 异步编程的一种实现方式就是回调函数; 回调函数是 一个 解决方案, 但它并不完美。 两个很大的问题是: 1. 颠倒的控制; 2. 糟糕的错误处理. 3. 异步任务嵌套回调. fs.readFile(filename, function (err, data) { if (err) { console.log('读文件出错' + err); } else { console.log(data.toString()); fs.readFile(filename, function (err, data) { if (err) { console.log('读文件出错' + err); } else { console.log(data.toString()); fs.readFile(filename, function (err, data) { if (err) { console.log('读文件出错' + err); } else { console.log(data.toString()); } }); } }); } }); 二、什么是promise? 相当是异步操作还未兑现的一个承若; promise对象 两种状态: 成功兑现 resolve 失败 rejected 程序创建promise var promise = new Promise(function(resolve,rejcted){ //具体异步 db.query(sql,parameter,function(err,data){ if(err){ rejected(err); } else{ resove(data); } }); }); promise.then(function(data){ console.log(data); //成功兑现 }).catch(function(err){ //处理错误 });
示例
//创建一个promise对象,处理异步读文件操作 var promise = new Promise(function (resolve, rejected) { //处理异步操作 异步买书,异步读文件 fs.readFile(filename, function (err, data) { if (err) { rejected(err); } else { resolve(data); } }); }); //then catch promise.then(function (data) { console.log(data.toString()); }).catch(function (err) { console.log('出错' + err); });
var fs = require('fs'); var filename = 'test.txt'; /** * 读文件 */ function readMyFile(filePath) { //创建一个promise对象,处理异步读文件操作 return new Promise(function (resolve, rejected) { //处理异步操作 异步买书,异步读文件 fs.readFile(filePath, function (err, data) { if (err) { rejected(err); } else { resolve(data); } }); }); }; //then catch readMyFile('test.txt') .then(function (data) { console.log('文件1内容'); console.log(data.toString()); return readMyFile('test1.txt'); }) .then(function (data2) { console.log('文件2内容'); console.log(data2.toString()); return readMyFile('test2.txt'); }) .then(function (data3) { console.log('文件3内容'); console.log(data3.toString()); }) .catch(function (err) { console.log('出错' + err); });
var fs = require('fs'); var filename = 'test.txt'; /** * 读文件 * 创建异步读文件未兑现的成若-promise对象 */ function readMyFile(filePath) { //创建一个promise对象,处理异步读文件操作 return new Promise(function (resolve, rejected) { //处理异步操作 异步买书,异步读文件 fs.readFile(filePath, function (err, data) { console.log('读文件 '+filePath); if (err) { rejected(err); } else { resolve(data); } }); }); }; /** * 并发执行任务 * * 所有任务执行完后一起处理 */ Promise.all([readMyFile('test.txt'), readMyFile('test1.txt'), readMyFile('test2.txt')]) .then(function(results){ console.log('处理结果'); console.log(results.toString()); }); /** * then函数处理最快执行完的异步执行 */ Promise.race([readMyFile('test.txt'), readMyFile('test1.txt'), readMyFile('test2.txt')]) .then(function (results) { console.log('处理结果'); console.log(results.toString()); });