
做人有原則,就什么都不怕
沒有受過傷的人,才會譏笑別人身上的傷痕! ---《羅密歐與朱麗葉》
本文主要講koa項目的建立,數(shù)據(jù)庫連接配置,靜態(tài)資源服務(wù),路由管理。讀完3分鐘,也可做練手的教程。
先看項目目錄

koa2項目目錄
lib —— 數(shù)據(jù)庫
node_modules —— 依賴庫
routers —— 路由
static ——靜態(tài)資源
app.js —— 項目入口文件
package-lock.json —— webpack配置文件
簡單的說下項目各部組合思想
1:app啟動頁,項目的入口,兼顧整個項目。因此,依賴,配置,都在這里
2:lib數(shù)據(jù)庫管理,后端工程師的核心工作內(nèi)容就是數(shù)據(jù),增刪改查。(每個功能的方法都不一樣,都寫在這里,所以需要分離,后期項目龐大,各個功能都要區(qū)分單獨的文件管理)
3:靜態(tài)資源,為什么?后端,前端的的react或vue都是靜態(tài)的資源,打包后放在這里,關(guān)閉跨域訪問,數(shù)據(jù)更安全。
中小形的項目就這樣的結(jié)構(gòu)了。或許,應(yīng)該足夠了。結(jié)下來,逐一分析。
一: app.js 項目入口
具體的怎么用,代碼上都有,
const Koa = require('koa')
const bodyParser = require('koa-bodyparser') //上下文解析
const Router = require('koa-router') //路由
const static = require('koa-static') //靜態(tài)資源服務(wù)
const path = require('path')
const cors = require('koa-cors') //跨域訪問組件
const app = new Koa()
// 配置靜態(tài)資源文件
const staticPath = './static'
app.use(static(
path.join( __dirname, staticPath)
))
// 允許跨域訪問
app.use(cors())
// body解析
app.use(bodyParser())
app.use(require('./routers/index').routes())
app.listen(3000)
console.log("啟動成功")
各個中間件的解釋:
- 所有引入的資源都要在事先使用npm安裝好
- koa: 項目的核心組件
- koa-bodyparser: 用來解析body的中間件,假如你post來傳遞表單,json數(shù)據(jù),或者上傳文件,在koa中是不容易獲取的,通過koa-bodyparser解析之后,在koa中this.body就能直接獲取到數(shù)據(jù)。
- koa-router:koa的路由中間間。
- koa-static : koa的靜態(tài)資源服務(wù)中間件
- path: 路徑獲取中間件
- koa-cors : 允許跨域請求的中間間,假設(shè)node的服務(wù)在3000端口,react的服務(wù)在3001。react獲取node的json時候??缬蛄恕8鉰sonp就麻煩多了。線上的時候根本用不到。
配置好各項中間件,設(shè)置好啟動端口,蓄勢待發(fā)?。?!
二:(router/index.js) 路由管理
不啰嗦,看代碼。都有注釋
const router =require('koa-router')(); //路由
const userModel = require('../lib/mysql') //數(shù)據(jù)庫方法
router.get('/',async(ctx,next) => {
ctx.redirect('/index')
})
router.get('/index',async(ctx,next) => {
let html = `
<h1> 老子吃火鍋,你吃火鍋底料 --gai </h1>
`
ctx.body = html
})
router.get('/api',async(ctx,next) => {
let resd = ''
await userModel.findAllPost()
.then(result => {
resd = JSON.parse(JSON.stringify(result))
// console.log(resd)
})
ctx.body = resd
})
module.exports= router
各個中間件的解釋
- 引入路由組件,注意,是執(zhí)行函數(shù)的的。加括號
- 數(shù)據(jù)庫引入,引入增刪改查的方法庫,后面數(shù)據(jù)管理還有講
- router.get() 路由中間件提供的方法,koa2的的最大的便捷之處就是使用es6的async異步寫法。
- 請求體,響應(yīng)體。要這么去理解,router.get('/index')這是請求體,koa去識別出來后,便執(zhí)行響應(yīng)體。
- 響應(yīng)體 let html='' 響應(yīng)的內(nèi)容,后面復(fù)雜的編程時,獲取的內(nèi)容是從數(shù)據(jù)庫加工處理后的內(nèi)容。
- ctx.body = html 響應(yīng)體返回的內(nèi)容 【看下面的代碼】
router.get('/index',async(ctx,next) => {
let html = `
<h1> 老子吃火鍋,你吃火鍋底料 --gai </h1>
`
ctx.body = html
})
全都返回json,讓前端工程師更忙碌吧,熟悉mysql,開發(fā)之前架構(gòu)設(shè)計好,能省很大的力 0.。0
三:lin 數(shù)據(jù)庫管理,配置
兩部分:1配置(config.js), 2,方法(mysql.js)
// 數(shù)據(jù)庫配置
const config = {
port: 3000,
database:{
DATABASE:'111', //數(shù)據(jù)庫
USERNAME:'hez', //用戶
PASSWORD:'aS62681***', //密碼
PORT:'3306', //端口
HOST:'39.106.12.86' //網(wǎng)址ip
}
}
module.exports = config
因為線上的,我注釋密碼了
const mysql = require('mysql')
const config = require('./default')
var pool = mysql.createPool({
host:config.database.HOST,
user:config.database.USERNAME,
password:config.database.PASSWORD,
database:config.database.DATABASE
});
let query = function( sql, values ) {
return new Promise(( resolve, reject ) => {
pool.getConnection(function(err, connection) {
if (err) {
resolve( err )
} else {
connection.query(sql, values, ( err, rows) => {
if ( err ) {
reject( err )
} else {
resolve( rows )
}
connection.release()
})
}
})
})
}
// 查詢t1數(shù)據(jù)庫
let findAllPost = function () {
let _sql = `
SELECT * FROM hez1
`
return query(_sql)
}
module.exports={
findAllPost
}
害怕,我懶?。?!
- 需要配置項,因為有線上,線下,各重版本。所以把配置項獨立出來會好方便很多
- 再多說一次,后端工作的核心就是數(shù)據(jù),真訣,增刪改查
- mysql寫的好,處理起數(shù)據(jù)來還是很省心的。使用js函數(shù)將sql方法寫好封裝起。暴露出來再各個組件,模塊中使用。
// 查詢t1數(shù)據(jù)庫
let findAllPost = function () {
let _sql = `
SELECT * FROM hez1
`
return query(_sql)
}
四:運行項目
當控制臺返回數(shù)據(jù)的時候,表示成功

控制臺的打印日志
- 頁面路由進入/api,返回數(shù)據(jù),表示成功。
- 當然,也能數(shù)據(jù)庫忽略,頁面返回 老子吃火鍋,你吃火鍋底料--gai 也表示成功
其實,項目要git,提交到代碼管理平臺。大家一起開發(fā),各人負責一塊業(yè)務(wù)的開發(fā),之后我會再寫一篇git的文章,平臺大概是碼云,github。
項目代碼地址,下一篇文章是在linx服務(wù)器(CentOS 7.3系統(tǒng))部署koa項目。內(nèi)容有koa2服務(wù)建立,nginx代理,mysql安裝,用戶管理,系統(tǒng)常用指令。
js全棧工程師必看的網(wǎng)址 我的個人網(wǎng)址,(還在建設(shè)中...)
關(guān)注我吧,因為寫react,koa,mysql,vue,reactNative等api,及技巧。不信關(guān)注我的微信或qq(626815494)看看。
掃一掃,添加作者微信
