关于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窗口, ...
随机推荐
- unknown variable 'log_bin_basename'
今天在处理一问题时,在my.cnf中设置了log_bin_basename=/DATA/log-bin,在启动时报unknown variable 'log_bin_basename' 经查mysql ...
- 一个随机验证码且不重复的小程序以及求随机输入一组数组中的最大值(Java)
1.代码: package day20181015;import java.util.Arrays;/** * 验证码的实现 * @author Administrator */public clas ...
- bzoj 3489 A simple rmq problem - 线段树
Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直 ...
- topcoder srm 305 div1
problem1 link 直接按照题意模拟即可. import java.util.*; import java.math.*; import static java.lang.Math.*; pu ...
- linux内核中的两个标记GFP_KERNEL和GFP_ATOMIC是用来干什么的?
1. 作用 用来标记分配内核空间内存时的方式 2. 两个标记使用在什么场合? 如果内存不够时,会等待内核释放内存,直到可以分配相应大小的内存,也就意味着会发生阻塞,因此不能使用在中断处理函数中,而GF ...
- Win10 快捷命令收集
桌面相关 Win+D:显示桌面 Win+Tab:虚拟桌面切换器 Win+Ctrl+D 新建桌面 Win+Ctrl+左/右 :移动虚拟桌面 Win+m :最小化窗口 Win键 + Ctrl + F4 关 ...
- LIS|计蒜客2019蓝桥杯省赛 B 组模拟赛(一)
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 9; int f[N], a[N]; int n; // ...
- Android Studio 快捷键、Debug的使用
https://blog.csdn.net/q908555281/article/details/49331371 1.快捷键 个人习惯常用快捷键 在Eclipse中常用的快捷键 ...
- 利用Python 脚本生成 .h5 文件 代码
利用Python 脚本生成 .h5 文件 import os, json, argparse from threading import Thread from Queue import Queue ...
- cmd中utf-8编码的问题
有时候我们需要使用cmd显示某个utf-8编码的文本,这时候就需要设置cmd的代码页为65100. 也就是 chcp 65001 这条命令.这样设置可以临时生效. 如何要永久生效,需要在注册表中修改. ...