1. Express 内置的异步错误处理
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]);
});
});
2. 利用 Promise 传递异步错误
Promise机制
https://www.cnblogs.com/superAnny/p/7622862.html
Promise本意是承诺,在程序中的意思就是承诺我过一段时间后会给你一个结果。 什么时候会用到过一段时间?答案是异步操作,异步是指可能比较长时间才有结果的才做,例如网络请求、读取本地文件等
1.Promise的三种状态
• Pending----Promise对象实例创建时候的初始状态
• Fulfilled----可以理解为成功的状态
• Rejected----可以理解为失败的状态
1. Promise入门
一、为什么要学习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);
});
2. 链式操作的用法
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);
});
3. 并行执行异步操作
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());
});