沒有受過傷的人汞扎,才會(huì)譏笑別人身上的傷痕! ---《羅密歐與朱麗葉》
本文主要講koa項(xiàng)目的建立擅这,數(shù)據(jù)庫(kù)連接配置澈魄,靜態(tài)資源服務(wù),路由管理仲翎。讀完3分鐘痹扇,也可做練手的教程铛漓。
先看項(xiàng)目目錄
lib —— 數(shù)據(jù)庫(kù)
node_modules —— 依賴庫(kù)
routers —— 路由
static ——靜態(tài)資源
app.js —— 項(xiàng)目入口文件
package-lock.json —— webpack配置文件
簡(jiǎn)單的說下項(xiàng)目各部組合思想
1:app啟動(dòng)頁(yè),項(xiàng)目的入口鲫构,兼顧整個(gè)項(xiàng)目浓恶。因此,依賴结笨,配置包晰,都在這里
2:lib數(shù)據(jù)庫(kù)管理,后端工程師的核心工作內(nèi)容就是數(shù)據(jù)炕吸,增刪改查伐憾。(每個(gè)功能的方法都不一樣,都寫在這里赫模,所以需要分離树肃,后期項(xiàng)目龐大,各個(gè)功能都要區(qū)分單獨(dú)的文件管理)
3:靜態(tài)資源瀑罗,為什么胸嘴?后端,前端的的react或vue都是靜態(tài)的資源斩祭,打包后放在這里劣像,關(guān)閉跨域訪問,數(shù)據(jù)更安全摧玫。
中小形的項(xiàng)目就這樣的結(jié)構(gòu)了驾讲。或許席赂,應(yīng)該足夠了。結(jié)下來时迫,逐一分析颅停。
一: app.js 項(xiàng)目入口
具體的怎么用,代碼上都有,
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("啟動(dòng)成功")
各個(gè)中間件的解釋:
- 所有引入的資源都要在事先使用npm安裝好
- koa: 項(xiàng)目的核心組件
- 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 : 允許跨域請(qǐng)求的中間間,假設(shè)node的服務(wù)在3000端口聂使,react的服務(wù)在3001壁拉。react獲取node的json時(shí)候谬俄。跨域了弃理。搞jsonp就麻煩多了溃论。線上的時(shí)候根本用不到。
配置好各項(xiàng)中間件痘昌,設(shè)置好啟動(dòng)端口钥勋,蓄勢(shì)待發(fā)!A咎Α算灸!
二:(router/index.js) 路由管理
不啰嗦,看代碼姑子。都有注釋
const router =require('koa-router')(); //路由
const userModel = require('../lib/mysql') //數(shù)據(jù)庫(kù)方法
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
各個(gè)中間件的解釋
- 引入路由組件,注意街佑,是執(zhí)行函數(shù)的的谢翎。加括號(hào)
- 數(shù)據(jù)庫(kù)引入,引入增刪改查的方法庫(kù)沐旨,后面數(shù)據(jù)管理還有講
- router.get() 路由中間件提供的方法森逮,koa2的的最大的便捷之處就是使用es6的async異步寫法。
- 請(qǐng)求體磁携,響應(yīng)體褒侧。要這么去理解,router.get('/index')這是請(qǐng)求體谊迄,koa去識(shí)別出來后闷供,便執(zhí)行響應(yīng)體。
- 響應(yīng)體 let html='' 響應(yīng)的內(nèi)容统诺,后面復(fù)雜的編程時(shí)歪脏,獲取的內(nèi)容是從數(shù)據(jù)庫(kù)加工處理后的內(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è)計(jì)好豪硅,能省很大的力 0.。0
三:lin 數(shù)據(jù)庫(kù)管理挺物,配置
兩部分:1配置(config.js)懒浮, 2,方法(mysql.js)
// 數(shù)據(jù)庫(kù)配置
const config = {
port: 3000,
database:{
DATABASE:'111', //數(shù)據(jù)庫(kù)
USERNAME:'hez', //用戶
PASSWORD:'aS62681***', //密碼
PORT:'3306', //端口
HOST:'39.106.12.86' //網(wǎng)址ip
}
}
module.exports = config
因?yàn)榫€上的识藤,我注釋密碼了
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ù)庫(kù)
let findAllPost = function () {
let _sql = `
SELECT * FROM hez1
`
return query(_sql)
}
module.exports={
findAllPost
}
害怕嵌溢,我懶C心痢!赖草!
- 需要配置項(xiàng)学少,因?yàn)橛芯€上,線下秧骑,各重版本版确。所以把配置項(xiàng)獨(dú)立出來會(huì)好方便很多
- 再多說一次,后端工作的核心就是數(shù)據(jù)乎折,真訣绒疗,增刪改查
- mysql寫的好,處理起數(shù)據(jù)來還是很省心的骂澄。使用js函數(shù)將sql方法寫好封裝起吓蘑。暴露出來再各個(gè)組件,模塊中使用坟冲。
// 查詢t1數(shù)據(jù)庫(kù)
let findAllPost = function () {
let _sql = `
SELECT * FROM hez1
`
return query(_sql)
}
四:運(yùn)行項(xiàng)目
當(dāng)控制臺(tái)返回?cái)?shù)據(jù)的時(shí)候磨镶,表示成功
- 頁(yè)面路由進(jìn)入/api,返回?cái)?shù)據(jù)健提,表示成功琳猫。
- 當(dāng)然,也能數(shù)據(jù)庫(kù)忽略私痹,頁(yè)面返回 老子吃火鍋脐嫂,你吃火鍋底料--gai 也表示成功
其實(shí),項(xiàng)目要git紊遵,提交到代碼管理平臺(tái)账千。大家一起開發(fā),各人負(fù)責(zé)一塊業(yè)務(wù)的開發(fā)暗膜,之后我會(huì)再寫一篇git的文章匀奏,平臺(tái)大概是碼云,github桦山。
項(xiàng)目代碼地址,下一篇文章是在linx服務(wù)器(CentOS 7.3系統(tǒng))部署koa項(xiàng)目醋旦。內(nèi)容有koa2服務(wù)建立恒水,nginx代理,mysql安裝饲齐,用戶管理钉凌,系統(tǒng)常用指令。
js全棧工程師必看的網(wǎng)址 我的個(gè)人網(wǎng)址捂人,(還在建設(shè)中...)
關(guān)注我吧矢沿,因?yàn)閷憆eact酸纲,koa捣鲸,mysql闽坡,vue栽惶,reactNative等api,及技巧疾嗅。不信關(guān)注我的微信或qq(626815494)看看。
掃一掃汁蝶,添加作者微信