Node.Js Express Sqlite3 接口开发
要使用Express,首先需要安装Node.js环境,然后通过npm init -y创建package.json文件,再输入npm install express安装框架。在实际使用中,Express 4或5版本均可使用。
新建app.js 文件 创建一个localhost:3012的应用程序
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3012;// 应用基础中间件
app.use(express.json());
app.use(express.urlencoded({ extended: true }));// 静态文件服务中间件
app.use(express.static('public'));app.all('/api/contrlor/action',async(req,res)=>{try{var SQLiteDB  =require("./DB/node_sqlite3_orm");const db = new SQLiteDB(path.join(__dirname,"./database/test.db"));var id=req.body.id;var data=await db.find("DeviceOnline",{Id:id});var model=Enumerable.from(data).where(p=>p.Id == id).firstOrDefault(null);//单个信息res.send({code:200,rc:true,model});}catch(error){console.log(error);res.send({ code:500,rc: false,str: error.message});}finally{}});app.listen(port, () => {console.log(`Example app listening at http://localhost:${port}`);
});
其中app.all 是api接口 也可以用路由中间件实现
var router = express.Router();router .all('/contrlor/action',async(req,res)=>{try{var id=req.body.id;var data=await db.find("DeviceOnline",{Id:id});var model=Enumerable.from(data).where(p=>p.Id == id).firstOrDefault(null);//单个信息res.send({code:200,rc:true,model});}catch(error){console.log(error);res.send({ code:500,rc: false,str: error.message});}finally{}});app.use('/api',router);db是数据ORM操作对象
const sqlite3 = require('sqlite3').verbose();
// const { EventEmitter } = require('events');class SQLiteORM {constructor(dbPath = ':memory:') {this.dbPath=dbPath;this.db = new sqlite3.Database(dbPath);this.models = new Map();this.lock = {readers: 0,writer: false,readQueue: [],writeQueue: []};}// 读写锁实现async _acquireRead() {return new Promise(resolve => {if (!this.lock.writer && this.lock.writeQueue.length === 0) {this.lock.readers++;resolve();} else {this.lock.readQueue.push(resolve);}});}async _acquireWrite() {return new Promise(resolve => {if (this.lock.readers === 0 && !this.lock.writer) {this.lock.writer = true;resolve();} else {this.lock.writeQueue.push(resolve);}});}_releaseRead() {this.lock.readers--;if (this.lock.readers === 0 && this.lock.writeQueue.length > 0) {this.lock.writer = true;const next = this.lock.writeQueue.shift();next();}}_releaseWrite() {this.lock.writer = false;while (this.lock.readQueue.length > 0) {this.lock.readers++;const next = this.lock.readQueue.shift();next();}}// ORM核心方法defineModel(name, schema) {const model = {name,schema,fields: Object.keys(schema),createTable: async () => {const columns = Object.entries(schema).map(([field, type]) => `${field} ${type}`).join(',');await this.run(`CREATE TABLE IF NOT EXISTS ${name} (${columns})`);}};this.models.set(name, model);return model;}// CRUD操作// 基础SQL执行方法async execute(sql, where = {}) {this.open();const conditions = Object.keys(where).map(k => `${k} = ?`).join(' AND ');const values = Object.values(where);await this._acquireRead();try {return new Promise((resolve, reject) => {this.db.all(`${sql} ${conditions ? 'WHERE ' + conditions : ''}`,values,(err, rows) => {this._releaseRead();err ? reject(err) : resolve(rows);});});} catch (err) {this._releaseRead();throw err;}finally {this.close().then((data)=>{console.log('数据库连接已关闭');}).catch((ex)=>{console.log(ex);});}}async executeSql(sql) {this.open();await this._acquireRead();try {return new Promise((resolve, reject) => {this.db.all(`${sql} ${conditions ? 'WHERE ' + conditions : ''}`,[],(err, rows) => {this._releaseRead();err ? reject(err) : resolve(rows);});});} catch (err) {this._releaseRead();throw err;}finally {this.close().then((data)=>{console.log('数据库连接已关闭');}).catch((ex)=>{console.log(ex);});}}async insert(modelName, data) {this.open();var self=this;const model = this.models.get(modelName);const fields = Object.keys(data).join(',');const placeholders = Object.keys(data).map(() => '?').join(',');await this._acquireWrite();try {return new Promise((resolve, reject) => {this.db.run(`INSERT INTO ${modelName} (${fields}) VALUES (${placeholders})`,Object.values(data),function(err) {self._releaseWrite();err ? reject(err) : resolve(this.lastID);});});} catch (err) {this._releaseWrite();throw err;}finally {this.close().then((data)=>{console.log('数据库连接已关闭');}).catch((ex)=>{console.log(ex);});}}async insertBatch(modelName, arr) {this.open();var self=this;await this._acquireWrite();try{return new Promise((resolve, reject) => {for(var data of arr){const model = this.models.get(modelName);var fields = Object.keys(data).join(',');var placeholders = Object.keys(data).map(() => '?').join(',');this.db.run(`INSERT INTO ${modelName} (${fields}) VALUES (${placeholders})`,Object.values(data),function(err) {self._releaseWrite();err ? reject(err) : resolve(this.lastID);});}});}catch (err) {this._releaseWrite();throw err;}finally {this.close().then((data)=>{console.log('数据库连接已关闭');}).catch((ex)=>{console.log(ex);});}}async find(modelName, where = {}, options = {}) {this.open();const model = this.models.get(modelName);const conditions = Object.keys(where).map(k => `${k} = ?`).join(' AND ');const values = Object.values(where);await this._acquireRead();try {return new Promise((resolve, reject) => {this.db.all(`SELECT * FROM ${modelName} ${conditions ? 'WHERE ' + conditions : ''}`,values,(err, rows) => {this._releaseRead();err ? reject(err) : resolve(rows);});});} catch (err) {this._releaseRead();throw err;}finally {this.close().then((data)=>{console.log('数据库连接已关闭');}).catch((ex)=>{console.log(ex);});}}async update(modelName, where, data) {this.open();var self=this;const setClause = Object.keys(data).map(k => `${k} = ?`).join(',');const whereClause = Object.keys(where).map(k => `${k} = ?`).join(' AND ');const values = [...Object.values(data), ...Object.values(where)];await this._acquireWrite();try {return new Promise((resolve, reject) => {this.db.run(`UPDATE ${modelName} SET ${setClause} ${whereClause ? 'WHERE ' + whereClause : ''}`,values,function(err) {self._releaseWrite();err ? reject(err) : resolve(this.changes);});});} catch (err) {this._releaseWrite();throw err;} finally {this.close().then((data)=>{console.log('数据库连接已关闭');}).catch((ex)=>{console.log(ex);});}}async updateBatch(modelName,where, arr) {this.open();await this._acquireWrite();try{var self=this;return new Promise((resolve, reject) => {for(var data of arr){const setClause = Object.keys(data).map(k => `${k} = ?`).join(',');const whereClause = Object.keys(where).map(k => `${k} = ?`).join(' AND ');const values = [...Object.values(data), ...Object.values(where)];this.db.run(`UPDATE ${modelName} SET ${setClause} ${whereClause ? 'WHERE ' + whereClause : ''}`,values,function(err) {self._releaseWrite();err ? reject(err) : resolve(this.lastID);});}});}catch (err) {this._releaseWrite();throw err;}finally {this.close().then((data)=>{console.log('数据库连接已关闭');}).catch((ex)=>{console.log(ex);});}}async delete(modelName, where) {this.open();const whereClause = Object.keys(where).map(k => `${k} = ?`).join(' AND ');const values = Object.values(where);await this._acquireWrite();var self=this;try {return new Promise((resolve, reject) => {this.db.run(`DELETE FROM ${modelName} ${whereClause ? 'WHERE ' + whereClause : ''}`,values,function(err) {self._releaseWrite();err ? reject(err) : resolve(this.changes);});});} catch (err) {this._releaseWrite();throw err;} finally {this.close().then((data)=>{console.log('数据库连接已关闭');}).catch((ex)=>{console.log(ex);});}}async transaction(callback) {this.open();await this._acquireWrite();try {await this.run('BEGIN TRANSACTION');const result = await callback();await this.run('COMMIT');return result;} catch (err) {await this.run('ROLLBACK');throw err;} finally {this._releaseWrite();this.close().then((data)=>{console.log('数据库连接已关闭');}).catch((ex)=>{console.log(ex);});}}open(dbPath = ':memory:') {try{this.db = new sqlite3.Database(this.dbPath?this.dbPath:dbPath);console.log('数据库连接已打开');}catch(error){console.log(error);}finally{}}close() {return new Promise((resolve, reject) => {this.db.close(err => {err ? reject(err) : resolve();});});}
}module.exports = SQLiteORM;// 使用示例:
// const SQLiteORM = require('./sqlite-orm');
// const db = new SQLiteORM('test.db');// // 定义模型
// db.defineModel('users', {
//   id: 'INTEGER PRIMARY KEY AUTOINCREMENT',
//   name: 'TEXT NOT NULL',
//   age: 'INTEGER'
// });// // 创建表
// await db.models.get('users').createTable();// // CRUD操作
// const userId = await db.create('users', { name: 'Alice', age: 25 });
// const users = await db.find('users', { age: 25 });
// const updated = await db.update('users', { id: userId }, { age: 26 });
// const deleted = await db.delete('users', { id: userId });接口服务

使用apipost接口调试工具

