在Node.js中使用SQLite3进行数据库操作

本文将展示如何在Node.js环境中使用SQLite3进行数据库操作。我们将通过示例代码来演示如何创建数据库表、插入数据和查询操作。

安装并导入sqlite3模块:

bash 复制代码
yarn add sqlite3
javascript 复制代码
const sqlite3 = require('sqlite3');

1. 获取当前日期

定义函数getDate,用于获取当前日期,并返回格式化后的日期字符串:

javascript 复制代码
const getDate = () => {
    const date = new Date();
    const options = { timeZone: 'Asia/Shanghai' };
    const formattedDate = date.toLocaleString('zh-CN', options);
    const today = formattedDate.split(" ")[0].replace(/\//g, '_');
    return today;
};

2. 生成表名

函数getName根据当前日期生成表名,这样每天的数据都会存储在对应日期的表中:

javascript 复制代码
const getName = () => `tab_${getDate()}`;

3. 默认回调函数

定义默认的回调函数defaultCallback,用于处理数据库操作的成功或失败情况:

javascript 复制代码
const defaultCallback = function (err) {
    if (err) {
        console.error('执行失败:', err);
    } else {
        console.log('执行成功', this.lastID);
    }
};

4. 检查表是否存在

函数isExist用于检查表是否存在,并根据结果执行不同的回调函数:

javascript 复制代码
const isExist = (db, name, sucb, facb) => {
    db.get(`SELECT name FROM sqlite_master WHERE type='table' AND name='${name}'`, (err, row) => {
        if (!err && row) {
            console.log('表存在');
            sucb(db);
        } else {
            console.log('表不存在');
            facb(db);
        }
    });
};

5. 创建表

函数newTask用于创建新的表:

javascript 复制代码
const newTask = (db, name, cb = defaultCallback) => {
    const newTab = `CREATE TABLE ${name} (id INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT, name TEXT, content TEXT, jump INTEGER)`;
    db.run(newTab, cb);
};

6. 插入数据

函数insertTask用于向表中插入数据:

javascript 复制代码
const insertTask = (db, name, data, cb = defaultCallback) => {
    const insert = `INSERT INTO ${name} (date, name, content, jump) VALUES (?, ?, ?, ?)`;
    db.run(insert, data, cb);
};

7. 更新数据库

函数updateDb用于更新数据库:

javascript 复制代码
const updateDb = (db, person, content) => {
    const name = getName();
    const data = [getDate(), person, content, 0];
    insertTask(db, name, data, () => {
        db.close();
    });
};

8. 创建数据库

函数createDb用于创建表,并将一条数据插入到表中:

javascript 复制代码
const createDb = (db, person, content) => {
    const name = getName();
    const data = [getDate(), person, content, 0];
    newTask(db, name, () => {
        insertTask(db, name, data, () => {
            db.close();
        });
    });
};

9. HTTP服务器

创建一个HTTP服务器,用于接收客户端的post请求,然后将post中的数据存入特定的数据库中去:

javascript 复制代码
const http = require('http');

const server = http.createServer((req, res) => {
    if (req.url === '/re_api') {
        if (req.method === 'OPTIONS') {
            res.setHeader('Access-Control-Allow-Origin', '*');
            res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
            res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
            res.setHeader('Access-Control-Max-Age', '86400');
            res.end();
            return;
        } else if (req.method === 'POST') {
            let body = '';

            req.on('data', chunk => {
                body += chunk;
            });

            req.on('end', () => {
                const { content, person } = JSON.parse(body);
                const db = new sqlite3.Database('test.db');
                isExist(db, getName(), () => {
                    updateDb(db, person, content);
                }, () => {
                    createDb(db, person, content);
                });

                res.setHeader('Access-Control-Allow-Origin', '*');
                res.setHeader('Content-Type', 'text/plain; charset=utf-8');
                res.end('提交成功');
            });
            return;
        }
    }

    res.statusCode = 404;
    res.end();
});

server.listen(9000, () => {
    console.log('后端服务已启动,监听端口 9000');
});

以上的代码都可以放在名为server.js的文件中,当后端服务器接收到客户端的数据之后,就会把数据存到当天日期命名的表中,方便之后的数据统计。下面是完整的代码:

js 复制代码
// db
const sqlite3 = require('sqlite3');

const getDate = () => {
    // 创建一个日期对象
    const date = new Date();
    // 配置时区
    const options = { timeZone: 'Asia/Shanghai' };
    // 使用配置的时区将时间戳转化成时间字符串
    const formattedDate = date.toLocaleString('zh-CN', options);
    // 解析得到当前时间
    const today = formattedDate.split(" ")[0].replace(/\//g, '_');
    return today;
}

const getName = () => `tab_${getDate()}`;

const defaultCallback = function (err) {
    if (err) {
        console.error('执行失败:', err);
    } else {
        console.log('执行成功', this.lastID);
    }
};

const isExist = (db, name, sucb, facb) => {
    // 检查表是否存在
    db.get(`SELECT name FROM sqlite_master WHERE type='table' AND name='${name}'`, (err, row) => {
        if (!err && row) {
            console.log('表存在');
            sucb(db);
        } else {
            console.log('表不存在');
            facb(db);
        }
    });
}

const newTask = (db, name, cb = defaultCallback) => {
    const newTab = `CREATE TABLE ${name} (id INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT, name TEXT, content TEXT, jump INTEGER)`;
    db.run(newTab, cb);
};

const insertTask = (db, name, data, cb = defaultCallback) => {
    const insert = `INSERT INTO ${name} (date, name, content, jump) VALUES (?, ?, ?, ?)`;
    db.run(insert, data, cb);
}


const updateDb = (db, person, content) => {
    const name = getName();
    const data = [getDate(), person, content, 0];
    insertTask(db, name, data, () => {
        db.close();
    });
}

const createDb = (db, person, content) => {
    const name = getName();
    const data = [getDate(), person, content, 0];
    newTask(db, name, () => {
        insertTask(db, name, data, () => {
            db.close();
        });
    })
}

// server
const http = require('http');

const server = http.createServer((req, res) => {
    console.log('req.url: ', req.url);
    console.log('req.method: ', req.method);
    if (req.url === '/re_api') {
        if (req.method === 'OPTIONS') {
            // 处理预检请求
            res.setHeader('Access-Control-Allow-Origin', '*');
            res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
            res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
            res.setHeader('Access-Control-Max-Age', '86400');
            res.end();
            return;
        }
        else if (req.method === 'POST') {
            let body = '';

            req.on('data', chunk => {
                body += chunk;
            });

            req.on('end', () => {
                console.log('请求体:', body);
                const { content, person } = JSON.parse(body);
                const db = new sqlite3.Database('test.db');
                isExist(db, getName(), () => {
                    updateDb(db, person, content);
                }, () => {
                    createDb(db, person, content);
                });

                res.setHeader('Access-Control-Allow-Origin', '*');
                res.setHeader('Content-Type', 'text/plain; charset=utf-8'); // 添加字符编码
                res.end('提交成功');
            });
            return;
        }
    }

    // 没有匹配的路径,返回 404
    res.statusCode = 404;
    res.end();
});

server.listen(9000, () => {
    console.log('后端服务已启动,监听端口 9000');
});
相关推荐
编码者卢布几秒前
【Azure Storage Account】Azure Table Storage 跨区批量迁移方案
后端·python·flask
徐同保41 分钟前
React useRef 完全指南:在异步回调中访问最新的 props/state引言
前端·javascript·react.js
刘一说1 小时前
Vue 导航守卫未生效问题解析:为什么路由守卫不执行或逻辑失效?
前端·javascript·vue.js
一周七喜h2 小时前
在Vue3和TypeScripts中使用pinia
前端·javascript·vue.js
weixin_395448912 小时前
main.c_cursor_0202
前端·网络·算法
东东5163 小时前
基于vue的电商购物网站vue +ssm
java·前端·javascript·vue.js·毕业设计·毕设
MediaTea3 小时前
<span class=“js_title_inner“>Python:实例对象</span>
开发语言·前端·javascript·python·ecmascript
她说..3 小时前
策略模式+工厂模式实现审批流(面试问答版)
java·后端·spring·面试·springboot·策略模式·javaee
梦梦代码精3 小时前
开源、免费、可商用:BuildingAI一站式体验报告
开发语言·前端·数据结构·人工智能·后端·开源·知识图谱
0思必得03 小时前
[Web自动化] Selenium执行JavaScript语句
前端·javascript·爬虫·python·selenium·自动化