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

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

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

本文主要講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)看看。


掃一掃,添加作者微信
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容