数据库

在JavaScript应用中,数据库用于存储和管理数据。根据数据模型和用途的不同,JavaScript应用中常用的数据库可以分为关系型数据库和非关系型数据库。

1. MongoDB

MongoDB是一个基于分布式文件存储的NoSQL数据库,使用JSON-like格式存储数据。

安装与连接

bash
# 安装MongoDB驱动
npm install mongodb
javascript
const { MongoClient } = require('mongodb');

// 连接URL
const url = 'mongodb://localhost:27017';
// 数据库名称
const dbName = 'myproject';

async function connect() {
  const client = new MongoClient(url);
  
  try {
    // 连接到MongoDB服务器
    await client.connect();
    console.log('Connected successfully to server');
    
    const db = client.db(dbName);
    return db;
  } catch (err) {
    console.error(err);
    throw err;
  }
}

基本操作

javascript
async function mongoOperations() {
  const db = await connect();
  const collection = db.collection('users');
  
  // 插入文档
  const insertResult = await collection.insertMany([
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 30 }
  ]);
  console.log('Inserted documents:', insertResult.insertedCount);
  
  // 查询文档
  const findResult = await collection.find({ age: { $gt: 25 } }).toArray();
  console.log('Found documents:', findResult);
  
  // 更新文档
  const updateResult = await collection.updateOne(
    { name: 'Alice' },
    { $set: { age: 26 } }
  );
  console.log('Updated documents:', updateResult.modifiedCount);
  
  // 删除文档
  const deleteResult = await collection.deleteOne({ name: 'Bob' });
  console.log('Deleted documents:', deleteResult.deletedCount);
}

2. SQLite

SQLite是一个轻量级的关系型数据库,不需要单独的服务器进程。

安装与连接

bash
# 安装SQLite3驱动
npm install sqlite3
javascript
const sqlite3 = require('sqlite3').verbose();

// 打开数据库连接
const db = new sqlite3.Database(':memory:', (err) => {
  if (err) {
    console.error(err.message);
  }
  console.log('Connected to the in-memory SQLite database.');
});

基本操作

javascript
// 创建表
db.run('CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)', (err) => {
  if (err) {
    return console.error(err.message);
  }
  console.log('Created users table.');
});

// 插入数据
db.run('INSERT INTO users (name, age) VALUES (?, ?)', ['Alice', 25], function(err) {
  if (err) {
    return console.error(err.message);
  }
  console.log(`A row has been inserted with rowid ${this.lastID}`);
});

// 查询数据
db.all('SELECT * FROM users', [], (err, rows) => {
  if (err) {
    throw err;
  }
  rows.forEach((row) => {
    console.log(row.id + ' - ' + row.name + ' - ' + row.age);
  });
});

// 更新数据
db.run('UPDATE users SET age = ? WHERE name = ?', [26, 'Alice'], function(err) {
  if (err) {
    return console.error(err.message);
  }
  console.log(`Row(s) updated: ${this.changes}`);
});

// 删除数据
db.run('DELETE FROM users WHERE name = ?', ['Alice'], function(err) {
  if (err) {
    return console.error(err.message);
  }
  console.log(`Row(s) deleted: ${this.changes}`);
});

// 关闭数据库连接
db.close((err) => {
  if (err) {
    return console.error(err.message);
  }
  console.log('Closed the database connection.');
});

3. Redis

Redis是一个开源的内存数据结构存储,可用作数据库、缓存和消息代理。

安装与连接

bash
# 安装Redis驱动
npm install redis
javascript
const redis = require('redis');

// 创建Redis客户端
const client = redis.createClient();

// 连接到Redis服务器
client.connect().then(() => {
  console.log('Connected to Redis server');
}).catch(err => {
  console.error('Redis connection error:', err);
});

基本操作

javascript
async function redisOperations() {
  // 设置键值对
  await client.set('user:1:name', 'Alice');
  await client.set('user:1:age', '25');
  console.log('Set key-value pairs');
  
  // 获取值
  const name = await client.get('user:1:name');
  const age = await client.get('user:1:age');
  console.log('User:', { name, age });
  
  // 设置哈希表
  await client.hSet('user:2', {
    name: 'Bob',
    age: '30',
    email: 'bob@example.com'
  });
  console.log('Set hash');
  
  // 获取哈希表
  const user = await client.hGetAll('user:2');
  console.log('User from hash:', user);
  
  // 列表操作
  await client.lPush('users', 'Alice');
  await client.lPush('users', 'Bob');
  await client.lPush('users', 'Charlie');
  
  const usersList = await client.lRange('users', 0, -1);
  console.log('Users list:', usersList);
}

4. 数据库ORM

ORM(Object-Relational Mapping)工具可以帮助开发者使用面向对象的方式操作数据库。

Sequelize (关系型数据库ORM)

bash
# 安装Sequelize和SQLite驱动
npm install sequelize sqlite3
javascript
const { Sequelize, DataTypes } = require('sequelize');

// 创建Sequelize实例
const sequelize = new Sequelize({
  dialect: 'sqlite',
  storage: 'database.sqlite'
});

// 定义模型
const User = sequelize.define('User', {
  name: {
    type: DataTypes.STRING,
    allowNull: false
  },
  age: {
    type: DataTypes.INTEGER,
    defaultValue: 18
  }
});

async function sequelizeOperations() {
  // 同步模型到数据库
  await sequelize.sync();
  console.log('Database synchronized');
  
  // 创建用户
  const user = await User.create({ name: 'Alice', age: 25 });
  console.log('Created user:', user.toJSON());
  
  // 查询用户
  const users = await User.findAll();
  console.log('All users:', users.map(u => u.toJSON()));
  
  // 更新用户
  await user.update({ age: 26 });
  console.log('Updated user:', user.toJSON());
  
  // 删除用户
  await user.destroy();
  console.log('User deleted');
}

5. 前端存储方案

localStorage

javascript
// 存储数据
localStorage.setItem('username', 'Alice');
localStorage.setItem('userage', '25');

// 获取数据
const username = localStorage.getItem('username');
const userage = localStorage.getItem('userage');
console.log('User:', { username, userage });

// 删除数据
localStorage.removeItem('userage');

// 清空所有数据
localStorage.clear();

IndexedDB

javascript
// 打开数据库
const request = indexedDB.open('MyDatabase', 1);

request.onupgradeneeded = function(event) {
  const db = event.target.result;
  // 创建对象存储
  const objectStore = db.createObjectStore('users', { keyPath: 'id' });
  // 创建索引
  objectStore.createIndex('name', 'name', { unique: false });
};

request.onsuccess = function(event) {
  const db = event.target.result;
  console.log('Database opened successfully');
  
  // 添加数据
  const transaction = db.transaction(['users'], 'readwrite');
  const objectStore = transaction.objectStore('users');
  
  const user = { id: 1, name: 'Alice', age: 25 };
  const addRequest = objectStore.add(user);
  
  addRequest.onsuccess = function() {
    console.log('User added successfully');
  };
  
  // 查询数据
  const getRequest = objectStore.get(1);
  getRequest.onsuccess = function() {
    console.log('Retrieved user:', getRequest.result);
  };
};

最佳实践

  1. 选择合适的数据库:根据应用需求选择关系型数据库或非关系型数据库
  2. 使用连接池:避免频繁创建和关闭数据库连接
  3. 参数化查询:防止SQL注入攻击
  4. 数据验证:在应用层对数据进行验证
  5. 错误处理:妥善处理数据库操作可能出现的错误
  6. 性能优化:创建适当的索引,优化查询语句

学习资源

最后更新:2026-02-08