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>