next.js集成mongodb
最近想统计一下博客的访问情况,所以准备集成一个mongodb,用于记录访问情况。
mongoose
mongoose是一个node.js的mongodb框架,包含了一系列开箱即用的功能。
安装
npm install mongoose --save连接mongodb
创建一个connection.ts文
import mongoose, {Schema} from "mongoose";export const connection = async () => { const url = `mongodb://${process.env.MONGO_HOST}:${process.env.MONGO_PORT}` console.log('url: ', url); return mongoose.connect(url, { user: process.env.MONGO_USER, pass: process.env.MONGO_PWD, dbName: process.env.MONGO_SCHEMA, });}export const disconnect = async () => mongoose.disconnect();export const testConnection = async () => { // 防止重复连接 if (mongoose.connection.readyState === 0) { await connection(); } const Test = mongoose.model('test', new Schema({title: String})); const query = Test.findOne() const test = await query.exec(); console.log(test);}让next.js服务启动的时候连接mongo
可以利用next.js的instrumentation.ts功能,在启动的时候执行一段逻辑(可以参考另外一篇博客:https://www.tiangua.info/blog/793b7194-5277-4efd-a5d3-c25c7b311d5e)
import {testConnection} from "@/server/dao/connection";export async function register() { console.log("启动完成") console.log(process.env["MONGO_URI"]) await testConnection()}定义schema
schema相当于mysql中的表,mongoose要操作schema,需要为每一个schema创建一个映射对象.
下面我定义了一个access_logs表,用于保存用户的访问记录
schema.ts
import {Schema} from "mongoose";export const AccessLogModelSchema = new Schema({ page_id: String, title: { type: String, default: '', required: false }, date: String, ip: String, city: { type: String, default: '', required: false }, country: { type: String, default: '', required: false }, region: { type: String, default: '', required: false }, latitude: { type: String, default: '', required: false }, longitude: { type: String, default: '', required: false },});保存数据到schema
mongo.ts
import mongoose from 'mongoose';import {AccessLogModelSchema} from './schema';import {connection} from './connection';export const saveAccessLog = async (log: { page_id: string, title?: string, date: string, ip: string, city?: string, country?: string, region?: string, latitude?: string, longitude?: string,}) => { // 防止重复连接 if (mongoose.connection.readyState === 0) { await connection(); } const Model = mongoose.model('access_log', AccessLogModelSchema) const accessLog = new Model(log); await accessLog.save();}