1.引入相應模塊
const express = require('express')
// 創建服務器express模塊,express框架是原生api共存的,所以使用此框架時可以使用任何原生方法屬性
const mysql = require('mysql') // mysql數據庫模塊
const log4js = require('log4js') // 打印log模塊
const path = require('path') // 路徑模塊
const expressStatic = require('express-static') // 引入靜態資源模塊
const fs = require('fs') // 讀文件模塊
2.啟動服務
let server = express() // 創建服務器 let serPort = 8080 // 監聽端口 啟動:node app.js(當前js文件名) 瀏覽器訪問:localhost:8080即可
因為這里使用的是mysql數據庫,所以在安裝node下mysql模塊后,我們還需要下載mysql數據庫到本地,最后使用可視化工具進行操作數據庫,這里我推薦使用Navicat for MySQL
3.建好數據庫和表以及定義數據格式數據類型

4.使用node連接數據庫如下
let db = mysql.createPool({host: '127.0.0.1', user: 'root',port: 3306,
password: '', database: 'xbb_front_tools_test'}) // 創建本地連接池
這里我設置node服務允許跨域請求,這樣前端就不行配置代理了:
server.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*"); // 跨域處理
next();
})
5.接口請求我這里使用如下:
因為我這里默認使用post請求,所以這里使用req.on('data') 和req.on('end')對請求
體進行了處理,如果使用get其實可以更簡單,不需要上述函數
server.use('/error/v1/ErrorSend', (req, res)=>{ // 插入數據庫
let data = '' // 這里有坑 一定空字符串(這里是因為post可以傳輸比較大的數據量,
當傳輸較大數據塊時,其實是一部分傳輸經過這樣拼接就是一個完整的請求體了)
req.on('data', (query)=>{
data+=query
})
req.on('end', ()=> {
let nextData = JSON.parse(data)
在這里添加執行與數據庫交互代碼
}
})
6.不熟悉的點就是mysql數據增刪改查了,寫mysql語句還是有點技巧的,這個得自己寫的時候才能體會,以下是操作mysql代碼:
// 插入數據庫 server.use('/error/v1/ErrorSend', (req, res)=>{ // 插入數據庫 let data = '' // 這里有坑空字符串 req.on('data', (query)=>{ data+=query }) req.on('end', ()=> { console.log(data, 'data') let nextData = JSON.parse(data) try { if (nextData.type !== undefined && nextData.errorMessage !== undefined && nextData.url !== undefined && nextData.userAgent !== undefined && nextData.platform !== undefined) { let addTime = new Date().getTime() db.query(`INSERT INTO receive_error (type,error_name, error_message, corpid, userid, url, user_agent, platform, add_time) VALUES(${nextData.type}, '${nextData.errorName ? nextData.errorName : ''}', '${nextData.errorMessage}', '${nextData.corpid ? nextData.corpid : ''}', '${nextData.userid ? nextData.userid : ''}', '${nextData.url}', '${nextData.userAgent}', '${nextData.platform}', ${addTime})`, (err, data) =>{ if (err) { console.log(err) res.send({msg: '服務器開小差', code: 0}) }else { res.send({msg: '操作成功', code: 1}) } res.end() }) }else { console.log(123456) res.send({msg: '請求參數缺失', code: 0}) res.end() } } catch (err) { res.send({msg: '服務器開小差', code: 0}) res.end() } }) })
7.對上述存到數據進行篩選,並分頁展示

mysql代碼如下:
server.use('/error/v1/receiveErrorLog', (req, res) =>{ // 獲取列表
let data = '' // 一定是空字符串
req.on('data', (param) => {
data+=param
})
req.on('end', ()=>{
let nextData = JSON.parse(data)
let queryParam = `SELECT * FROM receive_error WHERE 1=1`
if (nextData.type !== undefined) {
queryParam+=` AND type = ${nextData.type}`
}
if (nextData.errorName !== undefined) { // errorName不為空時
queryParam+=` AND error_name LIKE '%${nextData.errorName}%'`
}
if (nextData.errorMessage !== undefined) {
queryParam+=` AND error_message LIKE '%${nextData.errorMessage}%'`
}
if (nextData.corpid !== undefined) {
queryParam+=` AND corpid = '${nextData.corpid}'`
}
if (nextData.userid !== undefined) {
queryParam+=` AND userid = '${nextData.userid}'`
}
if (nextData.url !== undefined) {
queryParam+=` AND url LIKE '%${nextData.url}%'`
}
if (nextData.platform !== undefined) {
queryParam+=` AND platform = '${nextData.platform}'`
}
if (nextData.startTime !== undefined && nextData.endTime !== undefined) {
queryParam+=` AND add_time Between ${nextData.startTime} AND ${nextData.endTime}`
}
if (Object.keys(nextData).length > 2) {
let totalSql = queryParam
sqlPromise(totalSql,res).then((length) => {
queryParam+=` LIMIT ${((--nextData.currentPage) * nextData.pageSize)}, ${nextData.pageSize}`
filterQuery(queryParam, length, res)
}, (err) =>{
console.log(err)
})
}
if (Object.keys(nextData).length === 2) { // 針對初始化請求 只傳pageSize 和 currentPage
queryParam = `SELECT * FROM receive_error LIMIT ${((--nextData.currentPage) * nextData.pageSize)}, ${nextData.pageSize}`
let totalSql = `SELECT * FROM receive_error`
sqlPromise(totalSql,res).then((length) => {
filterQuery(queryParam, length, res)
}, (err) => {console.log(err)})
}
})
})
個人意見,歡迎指點!!!
