关于nodejs访问mysql的思考
nodejs要访问mysql数据库,首先必须要安装包mysql,命令:npm install mysql。安装成功后的访问数据库代码如下:
var mysql = require('mysql'); var options = { host: '172.23.88.107', port: 3306, database: 'test', user: 'root', password: 'zdsoft' }; var pool = mysql.createPool(options); pool.getConnection(function (err, conn) { if (err) { console.log(err);//打印错误消息 } else { conn.query("select * from student", null, function (err, results, fields) { //释放连接 conn.release(); if (err) { console.log(err); } else { console.log(results);//成功,打印结果集 } }) } });
ok,上面的代码经过测试是没有任何问题的,但是现在就有个问题了,我们每次访问数据库都写这么大一篇感觉太累了,于是我们想把公共的部分提取出来创建一个类,文件名为:sqlHelper.js。由于数据库访问是异步访问的,因此我们不能直接通过返回return的方式,因此就必须要使用回调函数,sqlHelper.js的代码如下:
var mysql = require('mysql'); var options = { host: '172.23.88.107', port: 3306, database: 'test', user: 'root', password: 'zdsoft' }; var pool = mysql.createPool(options); exports.query = function (sql, vals, fn) { pool.getConnection(function (err, conn) { if (err) { fn(new Error(err)); } else { conn.query(sql, null, function (err, results, fields) { //释放连接 conn.release(); if (err) { fn(new Error(err)); } else { fn(null, results, fields); } }) } }); }
这样,我们在调用的时候直接传入fn这个回调函数即可,调用方法如下:
var mysql = require('./lib/sqlHelper.js');//sqlHelper.js文件在lib文件夹下面 var result = mysql.query("select * from student", null, function (err, results, fields) { if (results) { for (let index = 0; index < results.length; index++) { console.log(results[index].name); } } else { console.log("err,msg:" + err); } });
自此,我们也算是大功告成了。
================================================分割线===========================================================
然而,我们还有另外一种实现方式,就是通过Promise这个对象,通过Promise对象我们可以像编写同步程序一样去编写异步代码,从而不用去无限次的嵌套回调函数,sqlHelper.js修改如下:
var mysql = require('mysql'); var options = { host: '172.23.88.107', port: 3306, database: 'test', user: 'root', password: 'zdsoft' }; var pool = mysql.createPool(options); exports.query = function (sql) { return new Promise(function (resolve, reject) { pool.getConnection(function (err, conn) { if (err) { reject(err);//让状态变为已失效,并把错误消息传递回去 } else { conn.query(sql, null, function (err, results, fields) { //释放连接 conn.release(); if (err) { reject(err); } else { resolve(results, fields);//让状态变为已成功,并把成功数据传递回去 } }) } }); }); }
调用方法修改如下:
var mysql = require('./lib/sqlHelper.js');//sqlHelper.js文件在lib文件夹下面 var promise = mysql.query("select * from student"); promise.then(function (results, fields) { for (let index = 0; index < results.length; index++) { console.log(results[index].name); } }, function (err) { console.log(err); });
可以看到,我们已经没有使用回调函数了。
分类:
Nodejs
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗