node_数据库模块化封装
// 文件目录 |___router | |___index.js | |___service | |___index.js | |___src | |___index.html | |___index.js //入口文件index.js
入口文件index.js
// Node 用 request 事件来处理请求响应,事件内使用分支语句处理不同路径的请求, // 而 Express 封装了这些操作,使得代码简洁优雅 // 但如果请求路径变多,都写在 app.js 文件里的话,就会让这个入口文件变得臃肿且难维护 // 加上 Node 是模块化编程,所以应该将这些 app.get() 和 app.post() 都抽取出来作为一个路由模块 router.js // Express 提供了一种更好的方式专门来包装路由 let express = require('express') // 在处理程序之前在中间件中解析传入的请求参数(post请求传送的参数),该处理程序在req.body属性下可用。 let bodyParser = require('body-parser') let router = require('./router/index.js') let app = express() // 解析应用程序/ x-www-form-urlencoded // 该extended选项允许您在使用querystring库(when false)或使用qs库(when true) // 解析URL编码的数据之间进行选择。“扩展”语法允许将丰富的对象和数组编码为URL编码格式, // 从而使URL编码具有类似JSON的体验,默认值为true,但是不建议使用默认值 app.use(bodyParser.urlencoded({ extended: false})) // 解析application / json app.use(bodyParser.json()) //表示路由默认在/index.html后面 http://localhost:8888/index.html/interface app.use('/index.html',router) // app.use(router) // 根路由 http://localhost:8888/interface //监听端口 app.listen(8888, ()=> {console.log(app.use);console.log(`server running port 8888`)}) //静态资源托管 app.use(express.static(__dirname+'/src'))
router/index.js
let express = require('express') //创建一个容器 let router = express.Router() let service = require('../service/index.js') // 把路由挂载到router容器中 router.get('/getdata', (req, res) => { let operate = `SELECT * FROM newsTable` service.handle(operate, data => res.send(JSON.stringify(data))) }) router.post('/adddata', (req, res) => { let params = req.body let operate = `INSERT INTO newsTable VALUES('${params.newsId}','${params.newsImg}','${params.newsTitle}','${params.newsDetail}');` service.handle(operate, data => {data ? res.send('success....') : res.send('fild....')}) }) router.post('/delete', (req, res) => { let params = req.body let operate = `DELETE FROM newsTable WHERE ${params.key}='${params.value}'` service.handle(operate, data => {data ? res.send('success....') : res.send('fild....')}) }) router.post('/update', (req, res) => { let params = req.body let operate = `UPDATE newsTable SET ${params.key}='${params.value}' WHERE ${params.whereKey}='${params.whereValue}'` console.log(operate) service.handle(operate, data => {data ? res.send('success....') : res.send('fild....')}) }) //导出模块 module.exports = router
service/index.js
// 引入模块 let mysql = require('mysql') let options = { host : 'localhost', // 主机地址 (默认:localhost) user : 'root', // 用户名 password : '123456', // 密码 database : 'newsdatabase' // 数据库名 // port, 端口号默认3306 // charset 连接字符集(默认:'UTF8_GENERAL_CI',注意字符集的字母都要大写) } module.exports = { handle (operate, callback) { // 创建连接 let connection = mysql.createConnection(options); // 连接数据库 connection.connect(); // 数据库语句操作 connection.query(operate, function (error, results, fields) { if (error) throw error; callback(results) }); // 断开数据库 connection.end(); } }
src/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://cdn.bootcss.com/axios/0.19.1/axios.js"></script> </head> <body> <button id="insertbtn">post添加数据</button> <button id="deletebtn">post删除数据</button> <button id="updatabtn">post修改数据</button> <button id="selectbtn">get查询数据</button> </body> <script type="text/javascript"> let data = { "newsId": "0013", "newsImg": "https://p1.pstatp.com/list/190x124/pgc-image/R6cefahHX9doHC", "newsTitle": "别傻傻不懂", "newsDetail": "2小时前" } insertbtn.onclick = async () => { let result = await axios({ url: 'http://localhost:8888/adddata', method: 'post', data }) console.log(result) } deletebtn.onclick = async () => { let result = await axios.post('/delete',{key: 'newsId', value: '0013'}) console.log(result) } updatabtn.onclick = async () => { let result = await axios.post('/update',{ key: 'newsImg', value: 'http://localhost:8888', whereKey:'newsId', whereValue: '0013' }) console.log(result) } selectbtn.onclick = async ()=> { let result = await axios.get('/index.html/getdata') console.log(result) } </script> </html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!