国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一個 PHPer 第一次用 Koa2 寫 Node.js 的心路歷程

894974231 / 2276人閱讀

摘要:可以有很多,每一個會注冊一個中間件,這個中間件是具體做事情的。每個中間件是依次執行的。一個經典的洋蔥圖可以解釋這一切。不過,由于是第一次用這貨寫項目,時間緊,偽任務重,看了文檔后發現,原來還有一個中間件列表的鏈接,里面有各種開源的中間件。

學了一段時間的 js 了,突然想實踐一下。正好公司有個小的項目要做,就順手拿 Koa2 來做了。真是不做不知道,做了想不到。踩了一堆新手坑。

初次接觸 Koa2

在知道 Koa2 之前,我也了解過 Express,可惜并沒有實戰用過。后來大家都說 Koa 是一個比 Express 更牛X的東西,于是在好(作)奇(死)心作祟下,直接去用 Koa2 了。后來證明的確是作死,原本用 PHP 一天就能寫完東西,愣是讓我搞了三天。

安裝

最近 Node.js V8 發布了,原生支持 asyncawait 調用了,所以直接把 Node.js 升級了一下。

根據 Koa2 的教程,安裝很簡單,我是使用的 yarn 的(還真是比 npm 快)。

yarn add koa

默認就裝了 Koa 2.2。然后裝完了,其實我是一臉懵逼的,文檔上說這樣用。

const Koa = require("koa")
const app = new Koa()
 
// response 
app.use(ctx => {
  ctx.body = "Hello Koa"
})
 
app.listen(3000)

我照著代碼寫了下來,的確成功了。可是,難不成我要把所有的邏輯寫在 app.use 里?

中間件

我感覺我受到了驚嚇,嚇得我趕緊往下看文檔。原來 Koa2 是一個中間件模型。app.use 可以有很多,每一個 app.use 會注冊一個中間件,這個中間件是具體做事情的。每個中間件是依次執行的。一個經典的洋蔥圖可以解釋這一切。

那么,上面的實例就可以改造成這樣。

app.use(async (ctx, next) => {
  await next()
  ctx.body = "Hello Koa"
})

按照上面的洋蔥頭,以心為單位,next的兩側的語句分別在洋蔥的左側和右側進行執行,頗像 Laravel 的中間件。

就這樣,我知道了,所有的操作不必寫在同一個 app.use 里。可是,下一個問題來了,我要把所有的邏輯都寫再一個文件里?說好的 MVC 呢?沒有 MVC 也叫做框架?Are you kidding me?(好吧后來發現原來 Koa2 并不是一個裝置做網站的框架)

既然沒有 MVC,那就自己動手豐衣足食吧。

路由

首先要處理的就是路由的問題。不過,由于是第一次用這貨寫項目,時間緊,(偽)任務重,看了文檔后發現,原來還有一個中間件列表的鏈接,里面有各種開源的中間件。我想你們一定隔著屏幕都能聽到我發出杠鈴般的笑聲了。有一個中間件非常棒,叫做 koa-router。這貨是這么用的。

var Koa = require("koa")
var Router = require("koa-router")
 
var app = new Koa()
var router = new Router()
 
router.get("/", function (ctx, next) {
  // ctx.router available
});
 
app.use(router.routes())

雖然是把邏輯和 app.use 分開了,但是,好像還是沒有解決剛才的問題。說好的 MVC 也沒有出現。于是我再去找了找,居然沒有 Controller 的中間件。我一下就懵逼了,玩脫了?還有一天啊我的寶貝兒。經過我半秒鐘的慎重思考,我還是用 koa-router 自己實現一個控制器吧。

Controller
const fs = require("fs")

function addRoutes(router, routes) {
  for (let route in routes) {
    switch (route.method) {
      case: "post":
        router.post(route.uri, route.fn)
        console.log(`Register post url: ${route.uri}`)
        break
      case: "get":
        router.get(route.uri, route.fn)
        console.log(`Register get url: ${route.uri}`)
        break
      default: 
        console.log(`Invalid url: ${route}`)
    }
  }
}

function addControllers(router) {
  let files = fs.readdirSync(__dirname + "/controllers")

  let controllerFiles = files.filter(f => {
    return f.endsWith(".js")
  })

  for (let controllerFile in controllerFiles) {
    console.log(`process controller: ${controllerFile}...`)
    let routes = require(__dirname + "/controllers")
    addRoutes(router, routes)
  }
}

module.exports = () => {
  let router = require("koa-router")()
  addControllers(router)
  return router.routes()
}

我通過在 controllers 文件夾中,創建若干 js 文件來作為 Controller 來使用。這里稍微參考了下 廖雪峰的文章。

然后,我們只需要在 controllers 文件夾中添加合適的文件就可以了。例如我們添加一個文件叫做 chart.js ,然后這樣寫代碼。

let hello = async (ctx, next) => {
  ctx.body = "Hello the fucking world!"
}

module.exports = [
  {
    method: "get",
    uri: "hello",
    fn: hello,
  }
]

最后再在 app.js 注冊中間件即可。

除此之外,我們還需要能夠處理 ctx 里的內容,因為它里面存儲的是原始的內容。還是由于時間緊,任(填)務(坑)重(急),我用了 koa-bodyparser。

const bodyParser = require("koa-bodyparser")

app.use(bodyParser())

這里要提醒的是,這貨一定要放在處理路由中間件的前面。

Model

MVCC 已經解決了,接下來就要解決 M 的問題了。這里我用的是 Sequelize。這個 ORM 和大多數的 ORM 都差不多,所以在這里這次沒有踩到什么坑。我在根目錄下新建了一個 config.js 的配置文件,然后新建了 model.js 用來定義模型。

const Sequelize = require("sequelize")
const config = require("./config").databases

...

module.exports = {
  //models
}
View

視圖,我是使用了一個中間件叫做 koa-view。由于它使用的是 Nunjucks 模板引擎,對于寫 PHP 的我相對熟悉一點。

const view = require("koa-view")

const app = Koa()

app.use(view(__dirname + "/views"))
//controller

let Hello = (ctx, next) => {
  ctx.render("hello", datas)
}

只要在 "views" 文件夾中定義相對應的 html 文件即可。

后記

這次的嘗試,終于在我的修修補補中,搞出了一個簡陋的 MVC 模型。趕在了 deadline 前完成,真是一波三折啊。學習新技術,就是這樣,要實踐嘛= =下面給出我的項目目錄作參考

koa2/
|
+- controllers/
|  |
|  +- chart.js
|  ...
|
+- static/
|  |
|  +- js/
|     ...
|  |
|  +- style/
|     |
|     +- img
|     ...
|
+- views/
|  |
|  +- game.html
|  ...
|
+- app.js
|
+- config.js
|
+- controller.js
|
+- model.js
|
+- package.json
|
+- yarn.lock
|
+- node_modules/

菜鳥作品,如有錯誤請指正,不勝感激。

如果你喜歡我的文章,那就請我喝杯奶茶吧~

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30589.html

相關文章

  • 一個 PHPer 一次 Koa2 Node.js 心路歷程

    摘要:可以有很多,每一個會注冊一個中間件,這個中間件是具體做事情的。每個中間件是依次執行的。一個經典的洋蔥圖可以解釋這一切。不過,由于是第一次用這貨寫項目,時間緊,偽任務重,看了文檔后發現,原來還有一個中間件列表的鏈接,里面有各種開源的中間件。 學了一段時間的 js 了,突然想實踐一下。正好公司有個小的項目要做,就順手拿 Koa2 來做了。真是不做不知道,做了想不到。踩了一堆新手坑。 初次接...

    cheukyin 評論0 收藏0
  • 2017年1月前端月報

    摘要:平日學習接觸過的網站積累,以每月的形式發布。年以前看這個網址概況在線地址前端開發群月報提交原則技術文章新的為主。 平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開發群月報 提交原則: 技...

    FuisonDesign 評論0 收藏0
  • 2017年1月前端月報

    摘要:平日學習接觸過的網站積累,以每月的形式發布。年以前看這個網址概況在線地址前端開發群月報提交原則技術文章新的為主。 平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開發群月報 提交原則: 技...

    ivyzhang 評論0 收藏0
  • 2017年1月前端月報

    摘要:平日學習接觸過的網站積累,以每月的形式發布。年以前看這個網址概況在線地址前端開發群月報提交原則技術文章新的為主。 平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開發群月報 提交原則: 技...

    CloudwiseAPM 評論0 收藏0

發表評論

0條評論

894974231

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<