用node作後臺寫接口供(express + mysql + node)前端調用

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 MySQLjavascript

 

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代碼以下:java

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)})
      }
  })
})

 

 

我的意見,歡迎指點!!!node

相關文章
相關標籤/搜索