当前位置: 首页 > news >正文

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接口调试工具

http://www.dtcms.com/a/565034.html

相关文章:

  • docker上部署 PolarDB-X v2.4.2数据库
  • 待办事项全栈实现:Vue3 + Node.js (Koa) + MySQL深度整合,构建生产级任务管理系统的技术实践
  • 【Solidity 从入门到精通】前言
  • 天硕工业级SSD深度解析:NVMe性能分层的根源与高可靠选型指南
  • 人证查验一体机:公安安全检查的智能新助手
  • Python 查找并高亮显示指定 Excel 数据
  • 如何把xmind里的一整段文字变成独立主题的方法
  • 免费CDN
  • 【Java】流程控制
  • 公司网站开源源码现在pc端网站开发用的什么技术
  • 【weblogic】JND注入漏洞
  • 简单建设一个网站的过程安徽建设工程协会网站
  • Spring Security权限认证机制详解 实战
  • java每日精进 11.03【基于Spring AOP和事件驱动的资源操作消息处理流程(类似于若依框架的@Log注解)】
  • Spring 从 0 → 1 保姆级笔记:IOC、DI、多配置、Bean 生命周期一次讲透
  • SpringBoot 项目基于责任链模式实现复杂接口的解耦和动态编排
  • Java 入门核心知识点分类学习
  • 叫人做网站后不提供源码商机网创业好项目
  • 【2052】范围判断
  • (1)pytest+Selenium自动化测试-序章
  • 用Python来学微积分29-原函数与不定积分完全指南
  • JavaSE---文件(File)、IO流(基础)
  • 论坛类网站备案吗红色专题网站首页模板
  • 网页设计师主要是做什么的呢深圳seo
  • C++多线程之 安全日志系统
  • 哪里有做效果图的网站wordpress文章内模板
  • Nof1:探索大语言模型作为量化交易者的极限(翻译)
  • 做网站整理信息的表格免费有效的推广网站
  • 基于ASM1042A系列芯片的CAN协议扩展方案在汽车座椅控制器中的应用探讨
  • 超越金融:深入解析STC的“绿色算力网络”与参与机制