1.0 前言
学习在 Koa 结合MongoDB,我们也是需要一些前置知识,比如 MongoDB 是干什么的?怎么安装?基本增删改查,下面是一些参考链接。
2.0 MonogoDB 基本使用
有了上面基本理论知识后,我们先用 Node.js 简单操作下 MongoDB,在 Node.js 中我们基本都是用 mongodb 这个 npm 包来操作数据库。
2.0.1 安装
npm i mongodb -s
2.0.2 基本使用
首先我们是链接数据库,我们上节讲过,一般我们实际开发是分不同环境配置的的, 本地开发我们可以链接本地数据库,生产环境我们肯定是连接其他数据的,所以数据库连接要区分环境。
首先我们配置数据库连接信息。
// app/config/dev.env.js
// 把数据库配置文件抽到配置文件
module.exports = {
baseUrl: '',
mongodb: {
port: 27017,
host: 'localhost',
database: 'koa-mongo-test',
poolSize : 40,
},
logger: {
applicationLevel: "debug",
accessLevel: "debug"
}
}
接下来,我们配置数据库信息。
// app/db/mogodb.js
const MongoClient = require('mongodb').MongoClient
const { mongodb } = require('../config')
const { logger } = require('../log4j/logger')
const { port, host, pass, userName, database, authSource = 'admin', poolSize = 40 } = mongodb
let connection
/**
* 这里我们初始化数据库连接
*/
async function initDB() {
let mongoUrl
if (userName && pass) {
mongoUrl = `mongodb://${userName}:${pass}@${host}:${port}?authSource=${authSource}`
} else {
mongoUrl = `mongodb://${host}:${port}`
}
return new Promise((resolve, reject) => {
MongoClient.connect(mongoUrl, {poolSize: poolSize} ,function(err, client) {
if(err) {
logger.error(err)
reject(err)
} else {
logger.info("Connected successfully to mongo")
connection = client.db(database)
resolve(connection)
}
})
})
}
async function getConnection() {
return connection
}
module.exports = {
initDB,
getConnection
}
参照 之前 Mysql 章节的配置,我们一样是需要在连接上数据库后再启动服务,所以我们也是在 bin/www 下面调用 initDB 方法,然后 在 app.js 中把 connection 对象放到 Koa 的 ctx 对象上,bin/www 下面代码我就不写,可以参照 Mysql 章节,同时看 Demo 源码,我们列下 app.js 绑定。
// app.js
const { getConnection } = require('./app/db/mogodb')
app.use(async (ctx, next) => {
const connection = await getConnection()
ctx.mongo = connection
await next()
})
2.0.3 用户接口处理
同样我们也是对用户的界面操作对应的接口做下处理。
MongoDB 里面使用集合 collection 来对应 Mysql 里面的 表 Table 的概念,这里我们给用户信息放在 user 这个集合里面。
async function list(ctx) {
//
const data = await ctx.mongo.collection('user').find({}).toArray()
ctx.body = {
data: data.map(ele => ({...ele, id: ele._id})),
success: true
}
}
async function detail(ctx) {
const id = ctx.params.id
const data = await ctx.mongo.collection('user').findOne({id}).toArray()
ctx.body = {
data: data[0],
success: true
}
}
async function add(ctx) {
const { path } = ctx.request.files.file
const { name, email } = ctx.request.body // 获取 request body 字段
const imgUrl = path.split("/static")[1]
const data = await ctx.mongo.collection('user').insertOne({ name, email, img_url: imgUrl })
ctx.body = {
data: data.ops[0],
success: true,
}
}
module.exports = {
detail,
list,
add
}
如上,我们对用户的新增,查询,详情接口做了处理,这样就可以把界面和数据的操作结合起来了,现在改造完成了。
3.0 小结
这节是讲 MongoDB 的基本操作,讲了, Node.js 中如何 和 MongoDB 创建连接,如何组织项目代码结构,最后用户一个的例子来实际操作,大家可以对着 Demo,跑起来,理解下,Demo 地址。