首頁  >  文章  >  web前端  >  深入了解Node.js中的Express框架

深入了解Node.js中的Express框架

青灯夜游
青灯夜游轉載
2021-06-15 10:21:132420瀏覽

本篇文章給大家詳細介紹一下Node.js中的Express框架。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

深入了解Node.js中的Express框架

很多語言都有一些框架,這些框架可以幫助我們更快捷地開發以及維護項目,像JS 就有Vue、React、Angular 等流行框架;而Node .js 也不例外,它也有一些框架可以幫助我們開發Node.js 專案。

目前比較流行的Node.js 框架有ExpressKoaEgg.js,無論是哪個Node.js 框架,都是基於中間件來實現的,而中間件的執行方式就需要依據洋蔥模型。 【推薦學習:《nodejs 教學》】

洋蔥模型

抽像一點解釋,就是從洋蔥中心點穿過去,就必須先一層層向內穿入洋蔥表皮進入中心點,然後再從中心點一層層向外穿出表皮,這裡有個特點:進入時穿入了多少層表皮,出去時就必須穿出多少層表皮。先穿入表皮,後再穿出表皮,這種結構是符合棧結構先進後出的原則的。

在Node.js 框架中,洋蔥的表皮我們可以定義為中間件

  • 從外向內進入中心點的過程是一個關鍵字next();
  • 而從內向外則是每個中間件執行完畢後,進入下一層中間件,一直到最後一層。

下面來簡單了解一些 Express 框架吧!

Express

Express 是Node.js 中HTTP 服務的一個框架,而要了解一個框架,最好的方法是

  • 去了解它的關鍵功能
  • 推導出它要解決的問題是什麼

#那要了解它的關鍵功能,我們可以去Express 的網站 看看它的Features,這些核心功能都是為了讓我們更方便、簡潔地寫出HTTP 服務,從而大大減輕我們的開發負擔,讓我們快速上手開發。

深入了解Node.js中的Express框架

一些Features

  • #路由:將對應路由分開當作模組處理
  • request/response 屬性的簡化,讓我們不需要經過轉換,然後直接使用對應的屬性。
    • requestpathnamequery# 等
    • responsesend() json()jsonp()
  • 中間件(next()
    • 更好地組織流程程式碼
    • 異步會打破Express 的洋蔥模型

Express 改造石頭剪刀布遊戲

現在透過使用Express 框架來改造石頭剪刀布遊戲,game.js 遊戲模組和index.html 頁面的程式碼沒有變動,可以去 github 上面clone

index.js Express 改造,需要先用 npm 安裝 expressnpm i express

const fs = require('fs');
const express = require('express');

const game = require('./game');
let playerWon = 0; // 赢的次数

const app = express();

// 路由功能,将对应路由功能分开作为模块处理,到时候也可以放到其它文件去
// 通过 app.get 设定 /favicon.ico 路径的路由
// .get 代表请求 method 是 get,所以这里可以用 post、delete 等。这个能力很适合用于创建 rest 服务
app.get('/favicon.ico', function (request, response) {
  // 一句 status(200) 即可代替 writeHead(200); end();
  // response.writeHead(200);
  // response.end();
  response.status(200);
  return;
})
// 打开页面 index.html
app.get('/', function (request, response) {
  // fs.createReadStream(__dirname + '/index.html').pipe(response);
  // send接口会判断你传入的值的类型,文本的话则会处理为text/html
  // Buffer的话则会处理为下载,html文件需要加上 `utf-8`
  response.send(fs.readFileSync(__dirname + '/index.html', 'utf-8'))
})

// next()同步状态下没有问题的,但是一旦有了异步,洋葱模型就打破了
app.get('/game',
  function (request, response, next) {
    if (playerWon >= 3) {
      response.status(500);
      response.send('我不会再玩了!');
      return;
    }
    // 通过next执行后续中间件
    next();
    // 当后续中间件执行完之后,会执行到这个位置
    if (response.playerWon) {
      playerWon++;
    }
  },
  // 获取玩家的操作
  function (request, response, next) {
    // Express 中对 request 做了一些处理,可以直接拿到 query 参数
    // const query = querystring.parse(parsedUrl.query);
    // const playerAction = query.action;
    const query = request.query;
    const playerAction = query.action;
    response.playerAction = playerAction;
    // 通过next执行后续中间件
    next();
  },
  function (request, response) {
    // 通过 response 去挂载一些参数
    let playerAction = response.playerAction;
    // 执行游戏逻辑
    const gameRes = game(playerAction);
    // 先返回头部
    // response.writeHead(200);
    response.status(200);
    // 根据不同的游戏结果返回不同的说明
    if (gameRes == 0) {
      // response.end('平局!');
      response.send('平局!');
    } else if (gameRes == 1) {
      response.send('你赢了!');
      // 玩家胜利次数统计+1
      // playerWon++;
      response.playerWon = true;
    } else {
      response.send('你输了!');
    }
  }
)
app.listen(3000);

程式碼位址:https://github.com/V-vincent/node-introduction

更多程式相關知識,請造訪:程式設計影片! !

以上是深入了解Node.js中的Express框架的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除