当我们开发API接口的时候,免不了需要对接到数据库存取数据,本篇文章主要介绍本人用的比较多的几个数据库的连接方式及连接中需要注意的要点,记录一下,以供参考
# MySQL 数据库
# 一、安装模块
npm install mysql -S
可通过packge.json
文件中的配置项来检查包是否安装成功
# 二、创建连接池
一般会会在db目录下创建一个mysql.js
文件来专门抽离连接对象,称为连接池
先用传统回调函数来封装连接池
# mysql.js
const mysql = require("mysql")
const connection = mysql.createConnection({
host: 'localhost'; // 数据库地址,可以是服务器公网IP
user: 'root'; // 用户:一般为root
port: '3306', // 默认端口是3306,可直接省略
password:'123456'; // 数据库密码
database: 'test'; // 数据库的名字
})
var db = {}
db.query = function(sql, callback){
if (!sql)
callback()
return;
}
pool.query(sql, function(err, rows, fields) {
if (err) {
callback(err, null)
return
}
callback(null, rows, fields)
});
}
module.exports = db
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
当然,现在更多的时候使用ES6 的Promise 语法来封装
# mysql.js
const mysql = require("mysql")
const connection = mysql.createConnection({
host: 'localhost'; // 数据库地址,可以是服务器公网IP
user: 'root'; // 用户:一般为root
port: '3306', // 默认端口是3306,可直接省略
password:'123456'; // 数据库密码
database: 'test'; // 数据库的名字
})
var db = {}
db.query = (sql) => {
return new Promise((resolve, reject) => {
if (!sql) return new Error();
pool.query(sql, function(err, rows, fields) {
if (err) return reject(err)
resovle(rows, fields)
});
})
}
module.exports = db
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 三、使用连接池操作数据库
传统回调函数的调用方式
# test.js
var db = require('./mysql.js')
var sql = 'SELECT count(*) as count from user'
db.query(sql, function(err, rows, fields){
if (err) {
console.log(err)
return
}
console.log('用户数量 : ', rows[0].count);
}
2
3
4
5
6
7
8
9
10
11
12
但使用Promise封装的方法调用更为简单合理
# test.js
var db = require('./mysql.js')
var sql = 'SELECT count(*) as count from user'
db.query(sql).then((rows, fields) => {
console.log('用户数量 : ', rows[0].count);
}).catch((err) => {
console.log(err)
})
2
3
4
5
6
7
8
9
10
11
# mongoDB 数据库
Mongoose是在node.js 异步环境下对mongodb 进行便捷操作的对象模型工具
编写MongoDB 验证,转换和业务逻辑是非常麻烦. 所以我们需要使用Mongoose
Mongoose为模型提供了一种直接的,基于scheme结构去定义你的数据模型。它内置数据验证, 查询构建,业务逻辑钩子等,开箱即用。
# 前提:安装mongoDB
通过软件安装包进行安装mongoDB
安装的时候记住安装的根盘符是什么,C盘还是D盘还是...
在安装目录的根盘符下面建一个文件夹命名为:“data”
在刚创建的data文件夹下面再创建一个新文件夹,命名为:“db”
打开命令台,启动 mongod
// 应用程序启动
1、直接点击mongoDB安装目录下面的mongod.exe,直接运行启动
2、点击mongo.exe则是将数据库运行在本地服务器 loaclhost:27017
// 命令行启动(注意这里用到的data>db是运行根盘符的,一般是C盘)
1、环境配置(安装bin目录)
2、执行mongod,mongo命令启动相应服务
2
3
4
5
6
7
可通过可视化软件MongoDBCompass.exe
管理数据库
# 一、安装模块
npm install mongoose
# 二、创建连接池
跟mysql 一样,一般数据库连接都会单独把连接操作独立抽取出来一个连接池,这里命名为mongo.js
# mongo.js
DB_URL = 'mongodb://localhost:27017/testDB'; /** * 连接地址 */
mongoose.connect(DB_URL, {useNewUrlParser: true, useUnifiedTopology: true });
mongoose.connection.on('connected', function () {
console.log('连接成功:Mongoose connection open to ' + DB_URL); }); /** * 连接成功 */
mongoose.connection.on('error',function (err) {
console.log('连接异常:Mongoose connection error: ' + err); });/** * 连接异常 */
mongoose.connection.on('disconnected', function () {
console.log('连接断开:Mongoose connection disconnected'); }); /** * 连接断开 */
module.exports = mongoose;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
如果上述中testDB
数据库不存在的情况,会自动创建
想要检查连接是否成功,只需要执行以下代码
node mongo.js
如果成功就会出现下面这种提示
从代码中可以看出,监听了几个事件,并且执行触发了connected事件,这表示连接成功。
connection中不止有如上几个事件,关键看你想要监听哪个事件。
其它事件可以自行查看:http://mongoosejs.com/docs/api.html#connection_Connection
这是最简单的连接字符串,当然还有其它形式,比如:连接密码、数据库连接设置、集群方式连式等等,这里解释了,用着了时候自行查询API文档
http://mongoosejs.com/docs/api.html#index-js
# 三、Schema
Mongoose 的一切始于 Schema。每个 schema 都会映射到一个 MongoDB collection ,并定义这个collection里的文档的构成。
下面我们定义一个user的Schema,命名为Schema.js
# Schema.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
username : { type: String }, //用户账号
userpwd: {type: String}, //密码
userage: {type: Number}, //年龄
logindate : { type: Date} //最近登录时间
});
2
3
4
5
6
7
8
9
10
11
在这之后你还想添加 keys 的话, 请使用 Schema#add 方法。
定义好了Schema,接下就是生成Model。
model是由schema生成的模型,可以对数据库的操作,生成model 的方式只要添加如下代码
module.exports = mongoose.model('User',UserSchema);
这个操作会在数据库下创建一个一个Blogs
的数据表
我个人习惯一般是将其当做建表的操作,所有生成Schema 都放在一个Schema.js
文件中,以导出对象的方式导出
module.exports = {
User: mongoose.model('User',UserSchema),
Blog: mongoose.model('Blog',BlogSchema),
...
}
2
3
4
5
# 四、操作数据库
接下来创建一个test.js
文件做一些常用操作演示。
# test.js
var User = require("./user.js")
/** * 插入操作 */
function insert(obj) {
var user = new User(obj);
return new Promise((resovle, reject)=> {
user.save(function (err, res) {
if (err) return reject(err)
resovle(res)
});
})
}
// 下面的代码一般在路由逻辑层调用
let user = { username : 'Tracy McGrady', //用户账号
userpwd: 'abcd', //密码
userage: 37, //年龄
logindate : new Date() //最近登录时间
}
insert(user).then((res)=> {
...
}).catch((err)=> {
...
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# SQLserver 数据库
# 一、安装模块
npm install mssql
# 二、创建连接池
首先来看一下官方的示例代码
const sql = require('mssql')
sql.connect(config).then(() => {
return sql.query`select * from mytable where id = ${value}`
}).then(result => {
console.dir(result)
}).catch(err => {
// ... error checks
})
sql.on('error', err => {
// ... error handler
})
2
3
4
5
6
7
8
9
10
11
12
13
对其进行封装一下,把连接池独立抽取出来
# connect.js
const sql = require('mssql')
const config = {
server: "127.0.0.1",
database: "test",
user: "sa",
password: "root",
port: 1433
}
let db = (sqlstr, callback) => {
sql.connect(config).then(function () {
return sql.query(sqlstr)
}).then(result => {
Promise.resovle(result)
sql.close();
}).catch(error => {
sql.close();
})
}
module.exports = db;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
注意在每次请求后需要关闭连接
# 三、操作使用
# app.js
var db = require('./db.js');
app.get('/users', (req, res) => {
var sql = "SELECT TOP 10 from user ORDER BY id DESC";
db(sql, result => {
console.log(result);
res.send(result);
})
})
2
3
4
5
6
7
8
9
10
11
12
13