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.jsconst MongoClient = require('mongodb').MongoClientconst { mongodb } = require('../config')const { logger } = require('../log4j/logger')const { port, host, pass, userName, database, authSource = 'admin', poolSize = 40 } = mongodblet connection/*** 这里我们初始化数据库连接*/async function initDB() {let mongoUrlif (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.jsconst { getConnection } = require('./app/db/mogodb')app.use(async (ctx, next) => {const connection = await getConnection()ctx.mongo = connectionawait 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.idconst 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.fileconst { 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 地址。
