1.0 前言

学习在 Koa 结合MongoDB,我们也是需要一些前置知识,比如 MongoDB 是干什么的?怎么安装?基本增删改查,下面是一些参考链接。

2.0 MonogoDB 基本使用

有了上面基本理论知识后,我们先用 Node.js 简单操作下 MongoDB,在 Node.js 中我们基本都是用 mongodb 这个 npm 包来操作数据库。

2.0.1 安装

  1. npm i mongodb -s

2.0.2 基本使用

首先我们是链接数据库,我们上节讲过,一般我们实际开发是分不同环境配置的的, 本地开发我们可以链接本地数据库,生产环境我们肯定是连接其他数据的,所以数据库连接要区分环境。

首先我们配置数据库连接信息。

  1. // app/config/dev.env.js
  2. // 把数据库配置文件抽到配置文件
  3. module.exports = {
  4. baseUrl: '',
  5. mongodb: {
  6. port: 27017,
  7. host: 'localhost',
  8. database: 'koa-mongo-test',
  9. poolSize : 40,
  10. },
  11. logger: {
  12. applicationLevel: "debug",
  13. accessLevel: "debug"
  14. }
  15. }

接下来,我们配置数据库信息。

  1. // app/db/mogodb.js
  2. const MongoClient = require('mongodb').MongoClient
  3. const { mongodb } = require('../config')
  4. const { logger } = require('../log4j/logger')
  5. const { port, host, pass, userName, database, authSource = 'admin', poolSize = 40 } = mongodb
  6. let connection
  7. /**
  8. * 这里我们初始化数据库连接
  9. */
  10. async function initDB() {
  11. let mongoUrl
  12. if (userName && pass) {
  13. mongoUrl = `mongodb://${userName}:${pass}@${host}:${port}?authSource=${authSource}`
  14. } else {
  15. mongoUrl = `mongodb://${host}:${port}`
  16. }
  17. return new Promise((resolve, reject) => {
  18. MongoClient.connect(mongoUrl, {poolSize: poolSize} ,function(err, client) {
  19. if(err) {
  20. logger.error(err)
  21. reject(err)
  22. } else {
  23. logger.info("Connected successfully to mongo")
  24. connection = client.db(database)
  25. resolve(connection)
  26. }
  27. })
  28. })
  29. }
  30. async function getConnection() {
  31. return connection
  32. }
  33. module.exports = {
  34. initDB,
  35. getConnection
  36. }

参照 之前 Mysql 章节的配置,我们一样是需要在连接上数据库后再启动服务,所以我们也是在 bin/www 下面调用 initDB 方法,然后 在 app.js 中把 connection 对象放到 Koa 的 ctx 对象上,bin/www 下面代码我就不写,可以参照 Mysql 章节,同时看 Demo 源码,我们列下 app.js 绑定。

  1. // app.js
  2. const { getConnection } = require('./app/db/mogodb')
  3. app.use(async (ctx, next) => {
  4. const connection = await getConnection()
  5. ctx.mongo = connection
  6. await next()
  7. })

2.0.3 用户接口处理

同样我们也是对用户的界面操作对应的接口做下处理。
MongoDB 里面使用集合 collection 来对应 Mysql 里面的 表 Table 的概念,这里我们给用户信息放在 user 这个集合里面。

  1. async function list(ctx) {
  2. //
  3. const data = await ctx.mongo.collection('user').find({}).toArray()
  4. ctx.body = {
  5. data: data.map(ele => ({...ele, id: ele._id})),
  6. success: true
  7. }
  8. }
  9. async function detail(ctx) {
  10. const id = ctx.params.id
  11. const data = await ctx.mongo.collection('user').findOne({id}).toArray()
  12. ctx.body = {
  13. data: data[0],
  14. success: true
  15. }
  16. }
  17. async function add(ctx) {
  18. const { path } = ctx.request.files.file
  19. const { name, email } = ctx.request.body // 获取 request body 字段
  20. const imgUrl = path.split("/static")[1]
  21. const data = await ctx.mongo.collection('user').insertOne({ name, email, img_url: imgUrl })
  22. ctx.body = {
  23. data: data.ops[0],
  24. success: true,
  25. }
  26. }
  27. module.exports = {
  28. detail,
  29. list,
  30. add
  31. }

如上,我们对用户的新增,查询,详情接口做了处理,这样就可以把界面和数据的操作结合起来了,现在改造完成了。
image.png

3.0 小结

这节是讲 MongoDB 的基本操作,讲了, Node.js 中如何 和 MongoDB 创建连接,如何组织项目代码结构,最后用户一个的例子来实际操作,大家可以对着 Demo,跑起来,理解下,Demo 地址