本章主要實現先後端接口調試:前端能夠經過axios調用後端接口,返回數據庫(mysql)中的數據的基本功能。因爲大部分的功能接口會在後面單獨詳細說明,因此這章只實現一個測試接口。css
上一章已經實現node啓動後端服務,當時在http.createServer() 中有一個回調函數serverHandle:html
/server/app.js
const handleBlogRouter = require('./router/blog')
const handleUserRouter = require('./router/user')
const mime = require('./util/mime')
const serverHandle = (req, res) => {
const url = req.url
res.setHeader('Content-type', mime(url))
req.path = url.split('?')[0]
const blogData = handleBlogRouter(req, res)
const userData = handleUserRouter(req, res)
if (url.match('api')) {
if (blogData) {
blogData.then(data => {
res.end(JSON.stringify(data))
})
return
}
if (userData) {
userData.then(data => {
res.end(JSON.stringify(data))
})
return
}
}
res.end()
}
module.exports = serverHandle
複製代碼
在serverHandle中咱們能夠經過判斷req.path來判斷不一樣類型的接口,這裏我加了url.match('api')來校驗路徑中是否含有api,若是有則證實是請求接口的路徑,假如後面有其餘功能能夠在else中補充。假如請求路徑命中了blog.js或者說blogData有對應返回,則直接給前端返回blogData返回的值。
能夠看到對應的blogData對應了一個方法,這是由於可能咱們的接口有不一樣類型,爲了方便後續維護,使代碼結構更清晰,因此新建了一個router文件夾,在這個文件夾中能夠根據不通的類型來分紅幾個不一樣的模塊,好比:blog.js、user.js等。這裏咱們就用blog.js中獲取博客列表接口舉例:前端
/server/router/blog.js
const { getList } = require('../controller/blog')
const { SuccessModel, ErrorModel } = require('../model/index')
const handleBlogRouter = (req, res) => {
const method = req.method
// 獲取博客列表
if (method === 'GET' && req.path === '/api/blog/list') {
return getList().then(list => {
return new SuccessModel(list)
})
}
}
module.exports = handleBlogRouter
複製代碼
getList實際上就是經過sql語句獲取博客列表的一個方法,直接返回數據庫數據,這裏咱們後面詳細說明,假如咱們請求的path爲/api/blog/list而且是get請求,那麼就說明咱們是博客列表接口,getList返回了一個列表數組list,能夠看到我並非直接將list直接返回到前端,而是經過SuccessModel, ErrorModel來對數據進行一個封裝,這是因爲一般咱們請求接口都會有code,若是code爲0證實返回成功,不然說明失敗,因此咱們也專門寫了兩個方法,對數據庫的數據進行了一次封裝:node
/server/model/index.js
class BaseModel {
constructor (data, message) {
if (typeof data === 'string') {
this.message = data
data = null
message = null
}
if (data) {
this.data = data
}
if (message) {
this.message = message
}
}
}
class SuccessModel extends BaseModel {
constructor (data, message) {
super(data, message)
this.code = 0
}
}
class ErrorModel extends BaseModel {
constructor (data, message) {
super(data, message)
this.code = -1
}
}
module.exports = {
SuccessModel,
ErrorModel
}
複製代碼
SuccessModel, ErrorModel實際就是簡單的對數據進行了封裝,data是實際數據,code判斷接口是否請求成功。到這裏咱們後端接口的邏輯就已經基本完成了。下面就是後端經過node連接mysql和使用簡單的sql語句獲取數據庫數據。mysql
首先,要在項目中安裝mysql:npm install mysql。 在本身電腦上也須要安裝mysql和一個可視化的mysql工具,我安裝的可視化工具是workbench,官網都有相關的下載,就很少介紹了。
安裝好mysql以後,咱們能夠打開workbench,點擊圖中標記按鈕新建一個數據庫myblogwebpack
/server/db/mysql.js
const mysql = require('mysql')
const { MYSQL_CONF } = require('../conf/db')
// 建立連接對象
const con = mysql.createConnection(MYSQL_CONF)
// 開始連接
con.connect()
// 統一執行sql函數
function exec(sql) {
return new Promise((resolve, reject) => {
con.query(sql, (err, res) => {
if (err) {
reject(err)
return
}
resolve(res)
})
})
}
module.exports = {
exec
}
// MYSQL_CONF mysql的相關配置
const env = process.env.NODE_ENV // 環境參數
let MYSQL_CONF
// 開發環境下
if (env === 'dev') {
MYSQL_CONF = {
host: 'localhost',
user: 'root',
password: 'selfpassword',
port: '3306',
database: 'myblog'
}
}
// 生產環境下
if (env === 'production') {
MYSQL_CONF = {
host: 'localhost',
user: 'root',
password: 'selfpassword',
port: '3306',
database: 'myblog'
}
}
module.exports = {
MYSQL_CONF
}
其中password爲本身設置的密碼
複製代碼
這部分爲一個封裝的執行sql語句的方法和mysql相關的配置。下面回到以前說的getList獲取博客列表的方法:ios
/server/controller/blog.js
const { exec } = require('../db/mysql')
const getList = () => {
// 返回假數據
const sql = 'select * from blogs;'
return exec(sql)
}
module.exports = {
getList
}
複製代碼
select * from blogs; 就是博客列表中須要獲取數據庫數據的sql語句,固然後面若是有篩選搜索等功能,這個sql語句會相應修改,目前是一個最簡單的語句用於測試咱們的數據庫是否已經鏈接成功。
如今咱們能夠試一下,運行咱們的服務端代碼,npm run server, 在瀏覽器輸入: http://localhost:3000/api/blog/list, 看下數據庫中的數據是否返回:git
如今咱們要準備調試前端請求,前端的解決就更容易了,首先咱們的前端代碼是在80端口,直接使用axios會跨域,直接在webpack的devServer中設置proxy代理便可:github
devServer: {
contentBase: path.resolve(__dirname, '../dist'),
historyApiFallback: true,
port: 8080,
inline: true,
hot: true,
host: 'localhost',
proxy: {
'/api': {
target: 'http://localhost:3000',
pathRewrite: {'^/' : ''}
}
}
}
複製代碼
而後咱們在/pages/blog/index.js中寫一個簡單的請求方法便可:web
import './index.css'
import axios from 'axios'
axios
.get('/api/blog/list')
.then(function(response) {
console.log(response)
})
.catch(function(error) {
console.log(error)
})
複製代碼
就是這麼最簡單的axios語法便可,由於咱們目前只是把先後端請求接口的邏輯調試清楚,代碼相關的優化尚未作,因此在這個js中直接寫了axios原生的方法來測試,後面可能會封裝成一個請求方法。
如今咱們運行一下項目, npm run start, 打開http://localhost:8080/html/blog.html
本章介紹了後端如何鏈接數據庫,並經過接口返回給前端數據;前端如何調試接口獲取後端數據:
下一章主要內容:
1.優化前端公用代碼(js、css);
2.實現項目登陸註冊功能;
GitHub地址:戳這裏
本項目僅爲學習交流使用,若是有小夥伴有更好的建議歡迎提出來你們一塊兒討論,另外感興趣的小夥伴就點個star吧! ^_^