关于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访问mysql的思考的更多相关文章
- 开源一个好用的nodejs访问mysql类库
一.背景问题 自nodejs诞生以来出现了一大批的web框架如express koa2 egg等等,前端可以不再依赖后端可以自己控制服务端的逻辑.原来的后端开发同学的阵地前端如今同样也写的风生水起,撸 ...
- nodejs 访问mysql
安装 $ npm install mysql 简介 这个一个mysql的nodejs版本的驱动,是用JavaScript来编写的.不需要编译 这儿有个例子来示范如何使用: var mysql = re ...
- java通过jdbc访问mysql,update数据返回值的思考
java通过jdbc访问mysql,update数据返回值的思考 先不说那么多,把Java代码贴出来吧. public static void main(String[] args) throws I ...
- rhel6.4 安装nodejs和Mysql DB服务
rhel6.4 安装nodejs和Mysql DB服务 安装好redhat6.4虚拟机后, 安装软件: # yum install gcc-c++ openssl-devel Loaded plugi ...
- 用Nodejs连接MySQL
转载,原地址:http://blog.fens.me/nodejs-mysql-intro/ 前言 MySQL是一款常用的开源数据库产品,通常也是免费数据库的首选.查了一下NPM列表,发现Nodejs ...
- NodeJS+Express+MySQL开发小记(2):服务器部署
http://borninsummer.com/2015/06/17/notes-on-developing-nodejs-webapp/ NodeJS+Express+MySQL开发小记(1)里讲过 ...
- vue+nodejs+express+mysql 建立一个在线网盘程序
vue+nodejs+express+mysql 建立一个在线网盘程序 目录 vue+nodejs+express+mysql 建立一个在线网盘程序 第一章 开发环境准备 1.1 开发所用工具简介 1 ...
- 转】用Nodejs连接MySQL
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! 用Nodejs连接MySQL 从零开始node ...
- 使用pm2启动nodejs+express+mysql管理系统步骤
背景: 由于个人兴趣,了解了一下nodejs+express+mysql项目.在项目搭建完成并开发完成并部署时,遇到一个尴尬的问题,就是后台的servive服务启动问题.日常开发时,打开2个cm窗口, ...
随机推荐
- 02: flask 使用举例
1.1 项目说明 https://github.com/rickyyangrui/Flask_web_demo1 1.项目文件结构 2.项目主文件 cssmin==0.2.0 Flask==0.1 ...
- 20145308 《网络对抗》Web安全基础实践 学习总结
20145308 <网络对抗> Web安全基础实践 学习总结 实验内容 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 基础问题回答 (1)SQL注入攻击原理, ...
- 如何用Tensorflow训练模型成pb文件和和如何加载已经训练好的模型文件
这篇薄荷主要是讲了如何用tensorflow去训练好一个模型,然后生成相应的pb文件.最后会将如何重新加载这个pb文件. 首先先放出PO主的github: https://github.com/ppp ...
- git博客好的例子
01: https://github.com/Gaohaoyang/gaohaoyang.github.io 02: https://gaohaoyang.github.io/2018/06/01/a ...
- bzoj 1419 Red is good - 动态规划 - 概率与期望
Description 桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元.可以随时停止翻牌,在最优策略下平均能得到多少钱. Input 一 ...
- 为什么说 HashMap 是非线程安全的?
我们在学习 HashMap 的时候,都知道 HashMap 是非线程安全的,同时我们知道 HashTable 是线程安全的,因为里面的方法使用了 synchronized 进行同步. 但是 HashM ...
- Failed to set session cookie. Maybe you are using HTTP instead of HTTPS to access phpMyAdmin.
原因:使用负载均衡的时候,第一次请求phpMyAdmin主页的时候web01进行处理,页面返回的cookie存放在web01上.填写用户名密码提交之后,是web02进行处理的,此时给页面的cookie ...
- myeclise中创建maven web程序
myeclipse自带了许多插件,因此使用频率很高,但是对maven框架下web程序似乎不是很好的支持,每次创建web程序总是会报一大堆的异常,因此特此记录一下如何在myeclipse下创建一个web ...
- init: wait for '/dev/block/bootdevice/by-name/cache' timed out and took 5007ms【学习笔记】
平台信息:内核:4.9.112系统:android one平台:qcom sdm439 作者:庄泽彬(欢迎转载,请注明作者) 一.android设备在开机的时候打印了如下的log,由于系统使用了AB分 ...
- 如何查看linux程序被何种版本的编译器编译的?
答: 使用vi工具之间搜索关键字"GCC"即可找出编译该程序的编译器版本号!