NodeJs之数据库异常处理
数据库异常
NodeJs版本:4.4.4
数据库链接错误
使用nodejs处理异常最麻烦不过,这里我抛开nodejs提供的domain
和一些第三方库专门处理的东西。操作数据库是我们常用的功能。通过回调,我们这里会有很多err出没。
如下:
var pool = require('../db.js');
var runtimeLog = require('../log.js').getLogger('runlog');
var Promise = require('bluebird');
function queryPromise(queryString) {
return new Promise(function(resolve, reject) {
pool.getConnection(function(err, connection) {
//connection.query(queryString, function(err, rows, fields) {
// if (!err) {
// resolve(rows);
// } else {
// runtimeLog.error(err)
// reject(err)
// }
// connection.release();
//});
})
})
}
module.exports = function() {
return new Promise(function(resolve, reject) {
queryPromise("select * from wb123_home_map GROUP BY onestair")
.then(function(results){
resolve(results);
})
.catch(function(err){
runtimeLog.error(err)
})
})
}
可以看到2个回调的地方都会有出错的可能。
并且这是一个模块,我们将它导出了。
这里我们故意将数据库链接的端口号填错,写成330666:
module.exports = {
host: '192.168.6.101',
database: 'web123',
user: 'root',
password: 'passw0rd',
protocol: 'mysql',
port: '330666',
query: {pool: true}
}
这样的话,在我们链接数据库的时候是会出错的。
这里我们使用了promise,所以在导出的函数中,我们使用了catch
,他会抓到queryPromise函数中的错误,并打印到日志中。
[2017-01-05 13:27:59.648] [ERROR] runlog - [err] [RangeError: port should be >= 0 and < 65536: 330666]
RangeError: port should be >= 0 and < 65536: 330666
...
数据库sql语句错误
我们修改一下代码,将数据库链接填对,修改sql语句为错误的语句。
var pool = require('../db.js');
var runtimeLog = require('../log.js').getLogger('runlog');
var Promise = require('bluebird');
function queryPromise(queryString) {
return new Promise(function(resolve, reject) {
pool.getConnection(function(err, connection) {
connection.query(queryString, function(err, rows, fields) {
//if (err) throw err;
if (!err) {
resolve(rows);
} else {
reject(err)
}
connection.release();
});
})
})
}
module.exports = function() {
return new Promise(function(resolve, reject) {
queryPromise("select * from wb123_home_map GROUP BY onestairs")
.then(function(results){
resolve(results);
})
.catch(function(err){
runtimeLog.error('[err]',err)
})
})
}
报错信息:
[2017-01-05 14:40:14.518] [ERROR] runlog - [err] { [Error: ER_BAD_FIELD_ERROR: Unknown column 'onestairs' in 'group statement']
code: 'ER_BAD_FIELD_ERROR',
errno: 1054,
sqlState: '42S22',
index: 0 }
Error: ER_BAD_FIELD_ERROR: Unknown column 'onestairs' in 'group statement'
at Query.Sequence._packetToError (E:\zz\zz_wb123\manage\trunk\code\nod
....
可以看到错误都是通过catch抛出。
所以如果使用了Promise
我们可以直接在catch
中抓到下面抛出的异常。不需要再去queryPromise
函数中打日志异常了。
这里有一篇stackoverflow处理错误的非常有用的问答node-js-best-practice-exception-handling
更多精彩文章请访问GitHub博客
无特殊声明的文章均为原创!
原创文章如若转载,请注明出处!http://www.cnblogs.com/zqzjs/
告诫自己即使再累,也不要忘记学习。成功没有捷径可走,只有一步接着一步走下去!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2015-10-24 关于学问与知识--请尊重它!