express错误处理与promise的入门

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

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

4. Promise重构用户管理系统数据持久化操作代码(即数据库操作)在这里插入图片描述