溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Node.js的Express框架怎么使用

發(fā)布時(shí)間:2022-12-02 10:23:25 來(lái)源:億速云 閱讀:106 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Node.js的Express框架怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Node.js的Express框架怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

目前比較流行的 Node.js 框架有 ExpressKoa 和 Egg.js,無(wú)論是哪個(gè) Node.js 框架,都是基于中間件來(lái)實(shí)現(xiàn)的,而中間件的執(zhí)行方式就需要依據(jù)洋蔥模型。

洋蔥模型

抽象一點(diǎn)解釋?zhuān)褪菑难笫[中心點(diǎn)穿過(guò)去,就必須先一層層向內(nèi)穿入洋蔥表皮進(jìn)入中心點(diǎn),然后再?gòu)闹行狞c(diǎn)一層層向外穿出表皮,這里有個(gè)特點(diǎn):進(jìn)入時(shí)穿入了多少層表皮,出去時(shí)就必須穿出多少層表皮。先穿入表皮,后穿出表皮,這種結(jié)構(gòu)是符合棧結(jié)構(gòu)先進(jìn)后出的原則的。

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

  • 從外向內(nèi)進(jìn)入中心點(diǎn)的過(guò)程是一個(gè)關(guān)鍵詞 next();

  • 而從內(nèi)向外則是每個(gè)中間件執(zhí)行完畢后,進(jìn)入下一層中間件,一直到最后一層。

下面來(lái)簡(jiǎn)單了解一些 Express 框架吧!

Express

Express 是 Node.js 中 HTTP 服務(wù)的一個(gè)框架,而要了解一個(gè)框架,最好的方法是

  • 去了解它的關(guān)鍵功能

  • 推導(dǎo)出它要解決的問(wèn)題是什么

那要了解它的關(guān)鍵功能,我們可以去 Express 的網(wǎng)站 查看它的 Features,這些核心功能都是為了讓我們更加方便、簡(jiǎn)潔地寫(xiě)出 HTTP 服務(wù),從而大大減輕我們的開(kāi)發(fā)負(fù)擔(dān),讓我們快速上手開(kāi)發(fā)。

一些 Features

  • 路由:將對(duì)應(yīng)路由分開(kāi)作為模塊處理

  • request/response 屬性的簡(jiǎn)化,讓我們不需要經(jīng)過(guò)轉(zhuǎn)換,然后直接使用對(duì)應(yīng)的屬性。

    • requestpathname、query 等

    • responsesend()、json()jsonp() 等

  • 中間件(next()

    • 更好地組織流程代碼

    • 異步會(huì)打破 Express 的洋蔥模型

Express 改造石頭剪刀布游戲

現(xiàn)在通過(guò)使用 Express 框架來(lái)改造石頭剪刀布游戲,game.js 游戲模塊和 index.html 頁(yè)面的代碼沒(méi)有變動(dòng),可以去 github 上面 clone。

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

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

const game = require('./game');
let playerWon = 0; // 贏的次數(shù)

const app = express();

// 路由功能,將對(duì)應(yīng)路由功能分開(kāi)作為模塊處理,到時(shí)候也可以放到其它文件去
// 通過(guò) app.get 設(shè)定 /favicon.ico 路徑的路由
// .get 代表請(qǐng)求 method 是 get,所以這里可以用 post、delete 等。這個(gè)能力很適合用于創(chuàng)建 rest 服務(wù)
app.get('/favicon.ico', function (request, response) {
  // 一句 status(200) 即可代替 writeHead(200); end();
  // response.writeHead(200);
  // response.end();
  response.status(200);
  return;
})
// 打開(kāi)頁(yè)面 index.html
app.get('/', function (request, response) {
  // fs.createReadStream(__dirname + '/index.html').pipe(response);
  // send接口會(huì)判斷你傳入的值的類(lèi)型,文本的話則會(huì)處理為text/html
  // Buffer的話則會(huì)處理為下載,html文件需要加上 `utf-8`
  response.send(fs.readFileSync(__dirname + '/index.html', 'utf-8'))
})

// next()同步狀態(tài)下沒(méi)有問(wèn)題的,但是一旦有了異步,洋蔥模型就打破了
app.get('/game',
  function (request, response, next) {
    if (playerWon >= 3) {
      response.status(500);
      response.send('我不會(huì)再玩了!');
      return;
    }
    // 通過(guò)next執(zhí)行后續(xù)中間件
    next();
    // 當(dāng)后續(xù)中間件執(zhí)行完之后,會(huì)執(zhí)行到這個(gè)位置
    if (response.playerWon) {
      playerWon++;
    }
  },
  // 獲取玩家的操作
  function (request, response, next) {
    // Express 中對(duì) request 做了一些處理,可以直接拿到 query 參數(shù)
    // const query = querystring.parse(parsedUrl.query);
    // const playerAction = query.action;
    const query = request.query;
    const playerAction = query.action;
    response.playerAction = playerAction;
    // 通過(guò)next執(zhí)行后續(xù)中間件
    next();
  },
  function (request, response) {
    // 通過(guò) response 去掛載一些參數(shù)
    let playerAction = response.playerAction;
    // 執(zhí)行游戲邏輯
    const gameRes = game(playerAction);
    // 先返回頭部
    // response.writeHead(200);
    response.status(200);
    // 根據(jù)不同的游戲結(jié)果返回不同的說(shuō)明
    if (gameRes == 0) {
      // response.end('平局!');
      response.send('平局!');
    } else if (gameRes == 1) {
      response.send('你贏了!');
      // 玩家勝利次數(shù)統(tǒng)計(jì)+1
      // playerWon++;
      response.playerWon = true;
    } else {
      response.send('你輸了!');
    }
  }
)
app.listen(3000);

讀到這里,這篇“Node.js的Express框架怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI