记一次 MongoDB 踩坑实录
作者:草梅友仁
前言
在上一篇“浅谈用 node.js 开发后台 api 的要点”中我提到过我用的数据库是云数据库 leancloud,但云数据库毕竟有次数限制,每日免费三万次。虽然还是绰绰有余,不过,由于某些原因,草梅在云数据库上有些滥用,在一些无关紧要的地方,比如域名访问统计、接口访问统计上浪费了很多调用次数,因此考虑将这部分大头移到自建的数据库上来节约调用次数。
在经过比对多款数据库后,最后选定了 MongoDB。
理由如下:1.MongoDB 是和 leancloud 一样的面向对象的非关系型数据库,使用上有共通之处;2.也因此,MongoDB 非常适合用来存储 json 对象。
由于原生的 MongoDB 包不太好用,因此使用封装后的 mongoose【版本号 5.7.0】来连接数据库。
下面就来讲讲这次开发中遇到的坑
踩坑 1:MongoDB 鉴权连接
在网上搜的教程基本上都是无鉴权直连的,这样做的坏处显而易见,非常容易被攻击。因此草梅从一开始就考虑要鉴权。
鉴权连接的写法如下
1 2 3 4 5 6 7 8 9 10 11 12 13
| import mongoose = require('mongoose') const dbName = 'test' const auth = { user: 'root', password: '123456' } const url = `mongodb://localhost:27017/${dbName}`
const db = mongoose.createConnection(url, { useNewUrlParser: true, auth, useUnifiedTopology: true })
db.on('error', console.error.bind(console, '连接错误 :')) db.once('open', () => { console.log('mongoose 已连接') }) export { db }
|
踩坑 2:Schema 的使用
在 Schema 的使用上,草梅可以说是踩了天大坑,以至于一度要放弃使用 Schema 了。
废话不多说,直接上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import { Schema } from 'mongoose' import { ObjectID } from 'mongodb' import { timeFormat } from './help' import { db } from './init'
const ApiStatistics = db.model('ApiStatistics', new Schema({ router: String, date: { type: String, default: timeFormat(Date.now(), 'YYYY-MM-DD') }, count: { type: Number, default: 1 }, },{ versionKey: false, timestamps: true }), 'ApiStatistics')
|
踩坑 3:查询并修改
因为是统计访问次数,所以必然要查询到对象再修改统计值,而在查询上,草梅又踩了很多坑
1 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 29
|
export async function apiStatisticsLocal(router: string) { try { let date = timeFormat(Date.now(), 'YYYY-MM-DD') let result = await ApiStatistics.findOne({ router, date }) if (!result) { let obj = new ApiStatistics({ router }) return obj.save() } else { await result.updateOne({ $inc: { count: 1 } })
return ApiStatistics.findById(result.id) } } catch (error) { console.error(error) return null } }
|
后记
总之,这次的开发还真的是有些不太容易的,之后的问题就是如何让域名访问统计也加入进来了。因为历史原因,域名访问统计还是 js 写的,没法直接对接,还是要稍微修改下才行。另外,像这种通用模块,其实也可以抽离出来写成一个单独的模块的,也方便调用
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/41c4e0f3.html
版权声明:转载请注明出处!