前端实现数据持久化的几种方式
前端可以通过操作文件或者数据库实现数据持久化,下面简单介绍几种方式,抛砖引玉。如有错误和疑问,欢迎指正补充。
1. 数据持久化方式
数据持久化的几种方式:
文件系统
数据库
关系型数据库-mysql
键值对数据库-redis
文档型数据库-mongodb
2. 文件系统数据库
使用 fs 模块的 readFile() 和 writeFile() 方法实现文件异步的读和写,还有同步读写方法 readFileSync() 和 writeFileSync(),同步读写方法程序会等待IO操作,在等待时间内,无法响应其他任何事件,且无法定义回调函数。所以一般异步方法使用较多。
// test.js const fs = require('fs'); function get(key){ fs.readFile('./db.json', (err, data) => { const json = JSON.parse(data); console.log(json[key]); }) } function set(key, value){ fs.readFile('./db.json', (err, data = '{}') => { const json = JSON.parse(data); json[key] = value; // 写入文件 fs.writeFile('./db.json', JSON.stringify(json), err => { if(err){ console.log(err) }else{ console.log('写入成功') } }) }) } // 命令行接口 const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) rl.on('line', input => { const [op, key, value] = input.split(' '); if(op == 'get'){ get(key); }else if(op == 'set'){ set(key, value); }else if(op == 'quit'){ rl.close(); } }) rl.on('close', () => { process.exit(0); })复制代码
运行结果如下:
// 执行命令 node test.js set test {name:11} 写入成功 get test {name: 11}复制代码
2. 关系型数据库mysql
首先安装依赖包 mysql2:
yarn add mysql2复制代码
示例代码如下:
(async () => { const mysql = require('mysql2/promise'); // 建立连接 const connection = await mysql.createConnection({ host: 'localhost', user: 'root', password: '123456', //此处密码不能直接写成数字,需要写成字符串形式 database: 'test' }); // 执行sql语句-建表 let result = await connection.execute('CREATE TABLE IF NOT EXISTS user (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(45) NULL,PRIMARY KEY (id))') console.log('建表成功', result); // 新增 result = await connection.execute('INSERT INTO user(name) VALUES(?)', ['Lucy']); console.log('新增成功', result); // 删除 result = await connection.execute('DELETE FROM user WHERE name=?', ['Lucy']); console.log('删除成功', result); })()复制代码
一般实际项目中会建立数据库连接池,通过复用之前的连接来减少连接数据库的次数,从而降低数据库的压力。
(async () => { const mysql = require('mysql2/promise'); const pool = mysql.createPool({ host: 'localhost', user: 'root', password: '123456', database: 'test' }); // 执行sql语句-建表 let result = await pool.execute('CREATE TABLE IF NOT EXISTS user (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(45) NULL,PRIMARY KEY (id))') console.log('建表成功', result); // 新增 result = await pool.execute('INSERT INTO user(name) VALUES(?)', ['Lily']); console.log('新增成功', result); })()复制代码
3. ORM-Sequelize
基于Promise的ORM(Object Relation Mapping),是一种数据库中间件,支持多种数据库,事务,关联等。无需写原生的SQL语句,用操作对象的方式即可操作数据库。但是对于复杂的数据联表查询,中间件的能力可能会有些限制。
首先安装依赖包Sequelize。
yarn add Sequelize复制代码
示例代码如下:
(async () => { const Sequelize = require('sequelize'); // 参数分别为'database', 'username', 'password' const sequelize = new Sequelize('test', 'root', '123456', { host: 'localhost', dialect: 'mysql' /* one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */ }); // 定义模型 const User = sequelize.define('User', { name: { type: Sequelize.STRING(20), allowNull: false }, role: { type: Sequelize.INTEGER, defaultValue: 0 } }) // 同步数据库 let ret = await User.sync(); // 数据增加 ret = await User.create({ name: '张三', role: 1 }) // 数据修改 ret = await User.update({ role: 2 },{ where: { name: '张三' } }) // 数据查找 const Op = Sequelize.Op; ret = await User.findAll({ where: { role: { [Op.eq]: 2 } } }) console.log(ret); //数据删除 ret = await User.destroy({ where: { role: { [Op.eq]: 3 } } }) })()复制代码
如果需要设置UUID-主键:
id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV1, primaryKey: true }
作者:邹R-ainna
链接:https://juejin.cn/post/7037510436698193934
伪原创工具 SEO网站优化 https://www.237it.com/