koa2教程【mysql需忿,路由诅炉,跨域,靜態(tài)服務(wù)】

做人有原則屋厘,就什么都不怕

沒有受過傷的人汞扎,才會(huì)譏笑別人身上的傷痕! ---《羅密歐與朱麗葉》

本文主要講koa項(xiàng)目的建立擅这,數(shù)據(jù)庫(kù)連接配置澈魄,靜態(tài)資源服務(wù),路由管理仲翎。讀完3分鐘痹扇,也可做練手的教程铛漓。


先看項(xiàng)目目錄

koa2項(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í)候磨镶,表示成功

控制臺(tái)的打印日志
  • 頁(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)看看。


掃一掃汁蝶,添加作者微信
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市论悴,隨后出現(xiàn)的幾起案子掖棉,更是在濱河造成了極大的恐慌,老刑警劉巖意荤,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異紫谷,居然都是意外死亡捐寥,警方通過查閱死者的電腦和手機(jī)笤昨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門瞒窒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崇裁,你說我怎么就攤上這事“挝龋” “怎么了锹雏?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我采记,道長(zhǎng)政勃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任稼病,我火速辦了婚禮,結(jié)果婚禮上援制,老公的妹妹穿的比我還像新娘芍瑞。我一直安慰自己晨仑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布拆檬。 她就那樣靜靜地躺著洪己,像睡著了一般。 火紅的嫁衣襯著肌膚如雪答捕。 梳的紋絲不亂的頭發(fā)上屑那,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音持际,去河邊找鬼。 笑死益眉,一個(gè)胖子當(dāng)著我的面吹牛姥份,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澈歉,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼娱颊!你這毒婦竟也來了凯砍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤剧罩,失蹤者是張志新(化名)和其女友劉穎座泳,沒想到半個(gè)月后惠昔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挑势,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潮饱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了香拉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扑毡,死狀恐怖盛险,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泉褐,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布膜赃,位于F島的核電站揉忘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏泣矛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一狂丝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倍试,春花似錦、人聲如沸县习。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沪蓬。三九已至,卻和暖如春样勃,著一層夾襖步出監(jiān)牢的瞬間性芬,已是汗流浹背峡眶。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工辫樱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俊庇,地道東北人狮暑。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓搬男,卻偏偏與公主長(zhǎng)得像彭沼,于是被迫代替她去往敵國(guó)和親缔逛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子姓惑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理于毙,服務(wù)發(fā)現(xiàn),斷路器唯沮,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • 框架提出的背景 ES6/7帶來的變革 自ES6確定和ES7中async/await開始普及堪遂,Node的發(fā)展變得更加...
    宮若石閱讀 8,510評(píng)論 1 14
  • 原文鏈接:http://www.reibang.com/p/6b816c609669 前傳 出于興趣最近開始研究k...
    懸筆e絕閱讀 7,218評(píng)論 1 11
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,185評(píng)論 25 707
  • 大概年假結(jié)束之后,各公司內(nèi)談及最多的話題都是關(guān)于節(jié)后綜合癥的問題踊兜,翻開手機(jī)也是各類信息各種勵(lì)志短語(yǔ)紛紛涉及佳恬,而對(duì)于...
    竹葉椒閱讀 226評(píng)論 3 2