精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

花 15 分鐘把 Express.js 搞明白,全棧沒有那么難

開發 前端
本文列舉了 Express 框架的核心,并舉例如何應用,整體并沒有那么難。掌握這部分知識,可以快速擁 API 開發的思維。

大家好,我是楊成功。

Express 是老牌的 Node.js 框架,以簡單和輕量著稱,幾行代碼就可以啟動一個 HTTP 服務器。市面上主流的 Node.js 框架,如 Egg.js、Nest.js 等都與 Express 息息相關。

Express 框架使用標準 Node.js 語法,主要由以下 3 個核心部分組成:

  • 路由。
  • 中間件。
  • 錯誤處理。

認識基本結構

Express 的基本結構很簡單,只需要三行代碼,應用就可以運行起來。

const express = require('express')
const app = express()

app.listen(9000, () => console.log('啟動成功'))

假設上述代碼寫在 index.js 中,我們啟動該應用使用命令 node ./index.js,控制臺會輸出“啟動成功”。

為了方便,我們也可以在 package.json 中創建快捷命令,如下:

// package.json
{
  "scripts": {
    "start": "node ./index.js"
  }
}

那么現在啟動應用就可以用 npm run start 命令。

不過這種方式在本地運行項目時會有一個弊端,就是修改文件后不會立即生效,需要重新啟動。為了提高效率,一般會使用一個名為 PM2 的模塊啟動 Node.js 應用。

首先全局安裝 pm2:

$ npm install -g pm2

安裝后在項目目錄下創建啟動配置文件 ecosystem.config.js,代碼如下:

module.exports = {
  apps: [
    {
      name: 'first-api',
      script: './index.js',
    },
  ],
}

然后在項目目錄下執行以下命令就可以啟動項目了:

$ pm2 start --watch

圖片

上圖中的 0 就是啟動應用的 ID,下面會用到。

PM2 常用大命令如下:

  • pm2 start:啟動應用,--watch 表示監聽文件修改自動重啟。
  • pm2 list:查看已啟動的應用列表。
  • pm2 logs <id>:查看日志輸出。
  • pm2 delete <id>:刪除指定應用。

應用啟動后監聽 9000 端口,但訪問 “http://localhost:9000” 卻沒有反應,請求被掛起,這是因為沒有設置如何處理請求。

Express 中通過定義路由來處理請求。

使用路由創建 API 接口

路由用于定義如何處理請求,定義方式采用以下結構:

app.METHOD(PATH, HANDLER)

其中 app 表示 Express 的實例,其余的三個部分都屬于路由配置,表示的含義如下:

  • METHOD:路由方法。
  • PATH:路由地址。
  • HANDLER:路由處理函數。

比如示例代碼中的路由是這樣子:

app.get('/', (req, res) => {
  res.send('Hello World')
})

使用app.get()定義了一個 GET 請求的路由,第一個參數 “/” 為路由地址,第二個參數為路由處理函數,是一個回調函數,該函數接受兩個參數分別表示請求和響應。

當路由方法和路由地址匹配到用戶請求時,路由處理函數就會執行。

路由方法根據基本 API 規則支持五種,分別如下:

  • app.get():GET 請求。
  • app.post():POST 請求。
  • app.put():PUT 請求。
  • app.delete():DELETE 請求。
  • app.all():匹配所有請求。

以上五個方法的參數都與示例路由一致。定義好路由后,我們的主要任務是在路由處理函數中編寫業務代碼,一般會包括接收請求參數、返回接口響應,這里要用到路由處理函數的兩個參數。

請求對象

路由處理函數的第一個參數表示請求對象,包含客戶端請求攜帶的相關數據,常用的屬性如下:

  • req.query:URL 附加參數。
  • req.body:請求體參數。
  • req.method:請求方法。
  • req.headers:請求頭對象。
  • req.params:URL 地址參數。

現在我們定義一個路由,將請求對象的這幾個屬性返回,看一下它們的值是什么:

app.post('/first/:id', (req, res) => {
  let { method, query, body, params, headers } = req
  res.send({ method, query, body, params, headers })
})

在 Postman 中請求地址 “http://localhost:9000/first/8?tag=test” 并傳入請求體參數 {data: "xxx"},請求結果如下:

圖片

對照請求參數和返回結果,可以發現路由地址中的 :id 占位符解析后被放到 “req.params” 對象下。地址參數 ?tag=test 解析后被放到 “req.query” 對象下。

但是有一個問題:請求體沒有被解析出來。

這是因為請求體是按照流處理的,無法直接獲取到,我們需要一個第三方工具包協助。首先安裝如下:

$ yarn add body-parser

然后在 index.js 中引入并加載:

const bodyParser = require('body-parser')
app.use(bodyParser.json())

現在重新請求,接可以看到 req.body 的返回結果了:

圖片

響應對象

路由處理函數的第二個參數表示響應對象,用于向客戶端返回結果,也就是定義接口的返回值。路由處理函數中必須設置響應,否則客戶端請求會一直處于掛起狀態,無返回值。

常用的響應方法有以下三種,用于返回不同類型的數據:

  • res.json():發送 JSON 響應。
  • res.render():發送視圖響應(HTML)。
  • res.send():發送各種類型的響應。

我們統一使用 res.send() 方法響應數據。一般在響應前還可以通過 res.status() 方法設置 HTTP 狀態碼,示例如下:

res.send('哈哈') // 狀態碼:200,返回值:"哈哈"
res.status(201).send({
  msg: 'created',
}) // 狀態碼:201,返回值:{msg:"created"}
res.status(401).send('請登錄') // 狀態碼:401,返回值:"請登錄"

發送響應時也常常會遇到問題,以下兩條原則請牢記,避免踩坑:

  • 一個路由處理函數中只能響應一次,不能重復響應。
  • res.send() 不能直接返回數字。

分組路由

使用 app 實例注冊路由固然方便,但是如果定義的路由很多,都注冊在 app 實例下很可能會帶來全局污染,這與全局變量一個道理。為了應用的健壯性,我們應該將路由分組。

Express 提供了 Router 類來創建模塊化的路由程序,它像一個微應用,可以隨時被 app 實例掛載。這樣就可以把一組路由保存在一個單獨的文件中,需要時加載,從而實現路由分組。

創建一個 router 文件夾用于保存路由文件,然后創建 router/test.js 文件,在文件中呢寫入路由代碼,如下:

// router/test.js
var express = require('express')
var router = express.Router()

router.post('/info', (req, res) => {
  res.send('TEST 路由組')
})

module.exports = router

這樣一個基本的路由模塊就寫好了,如果讓其生效,需要在主程序中加載該模塊:

const testRouter = require('./router/test.js')
app.use('/test', testRouter)

上述代碼表示請求 “/test” 時加載路由模塊,訪問某個路由時使用該路徑拼接路由地址,像下面這樣:

http://localhost:9000/test/info
# 返回 "TEST 路由組"

為了開發規范,我們統一把路由定義為路由模塊,而不直接在 app 下注冊。

理解中間件,搞懂框架原理

Express 應用是由一系列中間件構成的。中間件同樣是一個聽著很玄乎的詞兒,但它的本質就是一個函數。我們看一個中間件函數的代碼示例:

var myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}

中間件與普通函數的區別就是它有三個參數,分別表示請求對象(req),響應對象(res)和一個 next() 函數 ——— 也許你發現了,路由處理函數也是這個結構。

沒錯,路由處理函數本身就是一個中間件。

將中間件掛載到應用上,使用 app.use() 方法:

app.use(myLogger)

看到這里你又會發現,請求體解析包 body-parser 也是這么掛載的,因為該包也是一個中間件。

直接用 app.use() 掛載的中間件在收到任意請求時都會執行。如果要限定執行條件,可以添加一個路徑匹配,如下:

app.use('/test/*', myLogger)

這樣,只有以 /test 開頭的請求才會執行 myLogger 中間件,這看起來與路由注冊很相似。其實注冊路由正是這種中間件掛載方式的快捷寫法,只不過多了一個請求方法的限制。

Express 應用中一切皆中間件,如果匹配到多個中間件會按照順序依次調用。此時 next() 函數就能派上用場了,他的作用是進入下一個中間件。

比如代碼中的 myLogger 中間件,將它掛載到路由之前,那么每次請求首先會打印出 “LOGGED”,然后再進入路由處理函數。

如果 myLogger 中間件中沒有調用 next() 函數,請求就會被堵在這里,無法進入路由處理函數,此時請求會被掛起。

統一錯誤處理,提升健壯性

既然一切皆中間件,那么錯誤處理也是一個中間件。錯誤處理函數與其他的中間件函數稍有不同,它多了一個 err 參數,如下:

app.use((err, req, res, next) => {
  console.error(err.stack)
  res.status(500).send('服務器出錯了!')
})

err 參數表示錯誤信息,當發生錯誤時進入該中間件,此時要設置 HTTP 狀態碼為 500,并根據錯誤信息為客戶端返回錯誤響應。

錯誤處理中間件是一個兜底中間件,請確保它定義在所有中間件之后,是應用中的最后一個中間件。

請求進入錯誤中間件,說明前面的所有中間件都沒有匹配到。但是如果客戶端請求地址寫錯而進入錯誤處理中間件,此時返回 500 錯誤顯然不合理,應該是 404 資源未找到。

所以在錯誤處理中間件前,還應該定義一個 404 中間件。該中間件要在所有路由之后,錯誤處理之前,是應用的倒數第二個中間件,代碼如下:

app.use((req, res, next) => {
  res.status(404).send('Not Found')
})

好了,現在我們的應用就健壯多了。

總結

本文列舉了 Express 框架的核心,并舉例如何應用,整體并沒有那么難。掌握這部分知識,可以快速擁 API 開發的思維。

責任編輯:姜華 來源: 程序員成功
相關推薦

2013-06-14 09:27:51

Express.jsJavaScript

2019-02-21 10:38:10

Web 開發代碼

2017-04-24 08:31:26

Node.jsExpress.jsHTTP

2018-07-13 11:12:03

芯片設計 IC

2024-09-11 23:00:41

2021-10-11 10:41:14

TCP傳輸層協議網絡

2022-07-08 14:14:04

并發編程異步編程

2024-05-09 09:01:03

2014-03-31 15:32:36

AndroidNDK開發

2021-01-14 10:48:34

Docker CompNode.js開發

2023-03-27 09:40:01

GoWebAssembl集成

2022-07-11 12:37:15

安全運營網絡攻擊

2023-07-30 16:09:38

數字經濟數字化轉型

2025-03-05 00:02:00

Next.jsExpress.jAPI 路由

2013-01-06 13:45:14

2024-11-22 14:24:24

模型訓練

2018-07-30 09:00:49

技術管理實踐

2019-08-27 14:46:59

ElasticSearES數據庫

2020-07-10 08:03:35

DNS網絡ARPAne

2024-05-10 08:43:04

外觀模式接口系統
點贊
收藏

51CTO技術棧公眾號

91视频免费网址| 日本成人在线免费| 成人高清免费在线播放| 麻豆精品新av中文字幕| 久久夜色精品国产亚洲aⅴ| 久久久久久综合网| www.youjizz.com在线| 久久综合av免费| 国产在线精品播放| 日韩av女优在线观看| 黑人操亚洲人| 欧美成人三级电影在线| 粗暴91大变态调教| 午夜影院免费在线| 日本一区二区三区在线观看| 91久久精品一区二区别| 欧美日韩综合一区二区三区| 亚洲一区在线| 亚洲欧美激情四射在线日| 涩涩网站在线看| 韩国美女久久| 中文字幕日韩一区| 欧美亚洲另类在线一区二区三区| 国产免费一区二区三区最新不卡 | 亚洲精品一区二三区不卡| 亚洲视频第二页| 伊人久久国产| 亚洲电影在线播放| 日本女人高潮视频| 2021av在线| 国产亚洲欧美日韩俺去了| 国产精品手机在线| 99久久国产热无码精品免费| 日韩av一二三| 啪一啪鲁一鲁2019在线视频| 国语对白一区二区| 欧美另类视频| 欧美成人免费全部| 欧美激情精品久久久久久免费| 亚洲精品推荐| 日韩精品www| chinese麻豆新拍video| 超碰精品在线| 精品国产亚洲在线| 亚洲av午夜精品一区二区三区| 色诱色偷偷久久综合| 欧美日韩一区二区欧美激情| 国产日韩成人内射视频| 成人性生活视频| 欧美日韩亚洲91| 久久免费视频3| 欧美gv在线观看| 黄色成人av网| 欧美黑人经典片免费观看| segui88久久综合9999| 亚洲r级在线视频| 免费不卡av在线| 成入视频在线观看| 午夜精品福利在线| 69堂免费视频| 日本精品裸体写真集在线观看| 欧美日韩国产精品一区| 国产三区在线视频| 日本.亚洲电影| 91国偷自产一区二区三区观看| 18禁男女爽爽爽午夜网站免费| 亚洲女色av| 在线亚洲+欧美+日本专区| 成人黄色一区二区| 韩国精品视频在线观看 | 中文字幕第17页| 亚洲精品伊人| 日韩欧美亚洲国产另类| 韩国三级hd两男一女| 无码日韩精品一区二区免费| 亚洲欧美视频在线| 黄色一级片一级片| 综合日韩在线| 97成人超碰免| 中文字幕人妻互换av久久| 另类的小说在线视频另类成人小视频在线| 国产精品丝袜视频| av免费在线不卡| 99精品久久久久久| 亚洲精品高清国产一线久久| av在线免费播放| 天天操天天干天天综合网| 欧美日韩亚洲自拍| 亚洲亚洲一区二区三区| 精品亚洲一区二区三区四区五区 | 神马久久久久久久久久| 久久久99精品免费观看不卡| 亚洲一区二区三区四区中文| 新版中文在线官网| 91国偷自产一区二区开放时间| 加勒比av中文字幕| 国产精品sss在线观看av| 亚洲最新av在线| 国产一级生活片| 秋霞影院一区二区| 国产女主播一区二区三区| www.av在线播放| 午夜精品久久久久久久蜜桃app| 亚洲老女人av| 青草久久视频| 久久精品国产91精品亚洲| 日韩在线视频免费播放| 精品在线视频一区| 女同一区二区| 蜜桃传媒在线观看免费进入| 欧美艳星brazzers| 中文字幕免费高清视频| 99re66热这里只有精品8| 韩国国内大量揄拍精品视频| 91福利免费视频| 久久免费国产精品| 国产高清www| 国语精品视频| 中文字幕日本精品| 黄色一级片免费在线观看| 国产一区二区日韩精品| 污视频在线免费观看一区二区三区 | 免费日韩一级片| 国产精品一区二区三区网站| 五月天色一区| 惠美惠精品网| 亚洲精品电影网| 久久免费精彩视频| 极品少妇一区二区三区精品视频 | 国产在线999| 国产综合视频一区二区三区免费| 亚洲午夜久久久久久久久久久 | 加勒比在线一区| 99久久婷婷国产综合精品| 成人一区二区av| 国产乱码精品一区二区三区亚洲人 | 日韩欧美黄色动漫| av2014天堂网| 亚洲激情在线| 国产综合动作在线观看| 乱插在线www| 精品国产乱码久久久久久老虎 | 一区二区三区视频在线观看视频| 色婷婷av一区| 中文字幕免费视频| 日韩高清一区在线| 午夜精品一区二区在线观看| 久久久人成影片一区二区三区在哪下载| 亚洲成人av中文字幕| 亚洲一区二区91| 99精品视频在线免费观看| 免费一级特黄毛片| 伦理一区二区| 欧美最顶级丰满的aⅴ艳星| 国产又爽又黄网站亚洲视频123| 午夜伦理一区二区| 精品夜夜澡人妻无码av| 欧美亚洲一区| 五月天国产一区| 国产电影一区二区| 久久久精品网站| 国产黄色美女视频| 亚洲国产一区在线观看| 男男做爰猛烈叫床爽爽小说| 亚洲在线网站| 日本一区网站| 白嫩亚洲一区二区三区| 欧美激情精品久久久久久久变态| 精品人妻无码一区二区| 亚洲图片有声小说| 精品人妻一区二区三区视频| 日本特黄久久久高潮| 一区二区在线中文字幕电影视频| 97精品资源在线观看| 欧美丰满少妇xxxxx做受| 香蕉视频网站在线| 在线看国产一区| 五月天色婷婷丁香| 成人国产精品免费网站| 日本在线观看a| 国产精品黑丝在线播放| 国产厕所精品在线观看| 欧美片第一页| 久久久精品一区二区| 免费观看国产精品| 色网站国产精品| 成熟的女同志hd| 26uuu另类欧美| 可以看污的网站| 91久久久久| 亚洲精品永久www嫩草| 综合激情久久| 国产精品成熟老女人| wwwav在线| 国产亚洲激情在线| 国产成人久久精品77777综合| 精品成人av一区| 在线日韩国产网站| 97se亚洲国产综合自在线| 一道本在线免费视频| 亚洲精品综合| 国产又爽又黄ai换脸| 日韩深夜影院| 91青青草免费观看| 久久精品嫩草影院| 欧美亚洲一级片| 欧美人与动牲性行为| 一区二区三区 在线观看视| 丰满少妇被猛烈进入| 欧美视频在线观看一区| 可以免费看的av毛片| 亚洲精品少妇30p| 国产sm调教视频| proumb性欧美在线观看| 欧美丝袜在线观看| 日韩av中文在线观看| 波多野结衣家庭教师在线| 欧美一区二区三区久久精品| 五月天亚洲综合小说网| 女厕嘘嘘一区二区在线播放| 国产精品免费区二区三区观看| 日韩护士脚交太爽了| 日产日韩在线亚洲欧美| 大菠萝精品导航| 久久久日本电影| 三级福利片在线观看| 久久久国产一区二区| 伊人在线视频| 色综久久综合桃花网| 男生女生差差差的视频在线观看| 精品国产一区久久| 99久久精品国产一区色| 欧美精品自拍偷拍动漫精品| 国产精品成人无码| 在线观看日韩一区| 久久亚洲精品石原莉奈| 黑人巨大精品欧美一区二区免费| 精品一区免费观看| 亚洲一区二区免费视频| 青娱乐国产盛宴| 亚洲免费观看视频| 亚洲不卡在线播放| 亚洲视频免费在线观看| 国产传媒免费在线观看| 亚洲欧美自拍偷拍色图| 亚洲天堂网av在线| 亚洲精选视频免费看| 黑鬼狂亚洲人videos| 亚洲精品第一国产综合野| 真实国产乱子伦对白在线| 最近中文字幕一区二区三区| 三级av在线免费观看| 亚洲日本青草视频在线怡红院| 小泽玛利亚一区| 亚洲精品精品亚洲| 久久精品性爱视频| 欧美日韩国产色视频| 亚洲黄色小说图片| 91极品美女在线| 一炮成瘾1v1高h| 日韩一区二区电影| 人妻无码中文字幕| 精品成人a区在线观看| 天天干视频在线观看| 亚洲欧美国产精品va在线观看| 欧美黄色小说| 日韩在线视频免费观看高清中文| 动漫一区在线| 97精品一区二区视频在线观看| 咪咪网在线视频| 国产日本欧美一区二区三区在线| 亚洲人成网站在线在线观看| 成人9ⅰ免费影视网站| 天海翼亚洲一区二区三区| 色综合久久av| 欧美伊人影院| 日本wwww视频| 久久99国产精品久久| 亚洲无人区码一码二码三码| 26uuu精品一区二区| 影音先锋男人看片资源| 亚洲已满18点击进入久久| 亚洲另类欧美日韩| 欧美喷潮久久久xxxxx| 风流老熟女一区二区三区| 亚洲欧美一区二区三区在线| 麻豆tv在线| 欧美亚州一区二区三区| 日本久久二区| 女人一区二区三区| 午夜精品免费| 国产三级三级三级看三级| 国产成人精品免费一区二区| 少妇精品一区二区三区| 亚洲欧美一区二区三区国产精品 | 欧美成人性战久久| 懂色av中文在线| 国模极品一区二区三区| 另类中文字幕国产精品| 国产美女精品在线观看| 色777狠狠狠综合伊人| 波多野结衣之无限发射| 国产一区二区看久久| 欧美大波大乳巨大乳| 一区二区欧美在线观看| 中文字幕av网站| 亚洲精品国产精品乱码不99按摩| 麻豆视频在线免费观看| 日韩女优在线播放| 精品视频在线你懂得| 五月天激情图片| 免费观看在线色综合| 国产精品1000部啪视频| 亚洲精品国产成人久久av盗摄| 国产精品传媒在线观看| 日韩国产中文字幕| 欧美xxxxhdvideosex| 91系列在线播放| 手机在线一区二区三区| 日韩在线xxx| 91在线丨porny丨国产| 久久久精品视频免费观看| 欧美午夜视频网站| 精品无吗乱吗av国产爱色| 97色在线视频| 成功精品影院| 日韩美女爱爱视频| 国产精品99久久久久久似苏梦涵| 青青操在线播放| 在线观看av一区二区| 日韩国产福利| 国产91ⅴ在线精品免费观看| 国产劲爆久久| 免费拍拍拍网站| 国产 欧美在线| 久久丫精品久久丫| 日韩一区二区在线看| 国产在线看片| 91性高湖久久久久久久久_久久99| 日韩电影免费网站| 亚洲第一中文av| 国产精品你懂的| 国产一区二区自拍视频| 最近中文字幕2019免费| 国精品产品一区| gogogo免费高清日本写真| 国内外成人在线| 欧美极品aaaaabbbbb| 日韩你懂的在线播放| 久草免费在线色站| 国产欧美欧洲| 性感少妇一区| 最近中文字幕在线mv视频在线| 色婷婷国产精品久久包臀| 国产精品二线| 成人激情视频小说免费下载| 久久一区二区中文字幕| 午夜大片在线观看| 亚洲综合在线观看视频| 婷婷综合激情网| 欧洲成人在线观看| 日韩欧美精品综合| 91精品视频国产| 亚洲国产精品欧美一二99| 午夜在线视频免费| 国产精品嫩草影院久久久| 亚洲乱码在线| 亚洲啪av永久无码精品放毛片| 欧美日韩一区二区在线播放| 国内av一区二区三区| 成人a在线视频| 激情综合亚洲| 天天躁日日躁aaaa视频| 欧美日韩国产区一| 蜜桃成人365av| 日韩精品一区二区三区色偷偷| 久久99蜜桃精品| 九九热国产视频| 国产午夜精品视频免费不卡69堂| 日韩亚洲国产免费| 精品无码国产一区二区三区av| 久久亚区不卡日本| 国产精品热久久| 欧美亚州一区二区三区| 先锋资源久久| 亚洲一区二区在线免费| 欧美亚洲综合一区| 丁香花高清在线观看完整版| 欧美综合77777色婷婷| 国产成人在线影院 | 性久久久久久| 中文字幕在线观看成人 | 哥也色在线视频| 久久精品五月婷婷| 精品一区二区国语对白| 国产成人一区二区三区影院在线| 中文字幕av日韩| 加勒比视频一区| 亚洲日本黄色片| 色偷偷久久一区二区三区|