数据库
在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);
};
};
最佳实践
- 选择合适的数据库:根据应用需求选择关系型数据库或非关系型数据库
- 使用连接池:避免频繁创建和关闭数据库连接
- 参数化查询:防止SQL注入攻击
- 数据验证:在应用层对数据进行验证
- 错误处理:妥善处理数据库操作可能出现的错误
- 性能优化:创建适当的索引,优化查询语句
学习资源
最后更新:2026-02-08