跳到主要内容

Node.js数据库集成

介绍

在Node.js应用开发中,数据库是存储和检索数据的关键组件。Node.js生态系统提供了丰富的数据库驱动和ORM/ODM工具,使开发者能够轻松集成各种数据库。本文将重点介绍MongoDB和Redis的集成。

原理

MongoDB集成原理

MongoDB是一个文档型数据库,使用BSON(类似JSON)格式存储数据。Node.js通过MongoDB驱动或Mongoose ODM与MongoDB交互:

  • MongoDB驱动提供了低级别的API,直接与数据库通信
  • Mongoose是一个ODM(对象文档映射)工具,提供了更高级别的抽象,包括Schema定义、数据验证、中间件等

Redis集成原理

Redis是一个内存中的数据结构存储系统,可用于缓存、消息队列等。Node.js通过redis客户端与Redis交互:

  • 客户端与Redis服务器建立TCP连接
  • 通过发送命令和接收响应进行通信
  • 支持回调、Promise等多种API风格

图示

Node.js应用 -> Mongoose/Redis客户端 -> MongoDB/Redis服务器

实例

MongoDB集成 (使用Mongoose)

  1. 安装依赖
npm install mongoose
  1. 连接数据库
// db.js
const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/mydb', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log('Connected to MongoDB'))
.catch(err => console.error('Could not connect to MongoDB', err));
  1. 定义模型
// user.model.js
const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
name: {
type: String,
required: true,
trim: true
},
email: {
type: String,
required: true,
unique: true,
trim: true,
lowercase: true
},
age: {
type: Number,
min: 0
}
});

const User = mongoose.model('User', userSchema);
module.exports = User;
  1. 使用模型
// app.js
const User = require('./user.model');

// 创建用户
async function createUser() {
try {
const user = new User({
name: 'John Doe',
email: 'john@example.com',
age: 30
});
const result = await user.save();
console.log(result);
} catch (err) {
console.error(err);
}
}

// 查询用户
async function getUsers() {
try {
const users = await User.find();
console.log(users);
} catch (err) {
console.error(err);
}
}

Redis集成

  1. 安装依赖
npm install redis
  1. 连接数据库
// redis.js
const redis = require('redis');
const client = redis.createClient({
host: 'localhost',
port: 6379
});

client.on('connect', () => {
console.log('Connected to Redis');
});

client.on('error', (err) => {
console.error('Redis error:', err);
});

module.exports = client;
  1. 使用Redis
// app.js
const client = require('./redis');

// 设置键值对
client.set('name', 'John Doe', (err, reply) => {
if (err) throw err;
console.log(reply); // OK
});

// 获取键值对
client.get('name', (err, reply) => {
if (err) throw err;
console.log(reply); // John Doe
});

// 使用Promise API
const { promisify } = require('util');
const getAsync = promisify(client.get).bind(client);

async function getUserName() {
const name = await getAsync('name');
console.log(name); // John Doe
}

专业解决方案

MongoDB

  • Mongoose:最流行的MongoDB ODM
  • MongoDB Atlas:MongoDB云服务,提供托管的数据库服务
  • Monk:轻量级的MongoDB驱动包装器

Redis

  • ioredis:功能丰富的Redis客户端,支持Cluster、Sentinel等
  • redis-cli:Redis命令行工具
  • Redis Labs:Redis云服务

性能优化

  • 使用连接池管理数据库连接
  • 实现数据缓存减少数据库查询
  • 对频繁访问的数据创建索引
  • 分页查询大量数据
  • 避免在数据库中存储大文件,使用文件存储服务