後端服務基礎環境搭建

Node簡介

Node 是一個基於 V8 引擎的 Javascript 運行環境,它使得 Javascript 能夠運行在服務端,直接與操做系統進行交互,與文件控制、網絡交互、進程控制等。node

Chrome 瀏覽器一樣是集成了 V8 引擎的 Javascript 運行環境,與 Node 不一樣的是他們向 Javascript 注入的內容不一樣,Chrome 向 Javascript 注入了 window 對象,Node 注入的是 global,這使得二者應用場景徹底不一樣,Chrome 的 Javascript 全部指令都須要經過 Chrome 瀏覽器做爲中介實現。git

Express 簡介

express 是一個輕量級的 Node Web 服務端框架,一樣是一我的氣超高的項目,它能夠幫助咱們快速搭建基於 Node 的 Web 應用。github

項目初始化

建立項目express

➜  code mkdir admin-cloud
➜  code cd admin-cloud
➜  admin-cloud npm init -y
Wrote to /Users/a1/Documents/code/admin-cloud/package.json:

{
  "name": "admin-cloud",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}


➜  admin-cloud

安裝依賴npm

➜  admin-cloud npm i -S express
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN admin-cloud@1.0.0 No description
npm WARN admin-cloud@1.0.0 No repository field.

+ express@4.17.1
added 50 packages from 37 contributors in 3.931s


   ╭────────────────────────────────────────────────────────────────╮
   │                                                                │
   │       New minor version of npm available! 6.9.0 → 6.14.5       │
   │   Changelog: https://github.com/npm/cli/releases/tag/v6.14.5   │
   │               Run npm install -g npm to update!                │
   │                                                                │
   ╰────────────────────────────────────────────────────────────────╯

➜  admin-cloud

建立 app.jsjson

const express = require('express')

// 建立 express 應用
const app = express()

// 監聽 / 路徑的 get 請求
app.get('/', function(req, res) {
  res.send('hello world node')
})

// 使 express 監聽 8000 端口號發起的 http 請求
const server = app.listen(8000, function() {
  const { address, port } = server.address()
  console.log('Http Server is running on http://%s:%s', address, port)
})

Express 三大基礎概念

中間件

中間件是一個函數,在請求和響應週期中被順序調用。api

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

app.use(myLogger)

提示:中間件須要在響應結束前被調用。瀏覽器

路由

應用如何響應請求的一種規則。bash

響應 / 路徑的 get 請求:網絡

app.get('/', function(req, res) {
  res.send('hello world node')
})

響應 / 路徑的 post 請求:

app.post('/', function(req, res) {
  res.send('hello world node')
})

規則主要分兩部分:

  • 請求方法:get、post......
  • 請求的路徑:/、/servers、/.*net$/......

異常處理

經過自定義異常處理中間件處理請求中產生的異常。

app.get('/', function(req, res) {
  throw new Error('something has error...')
})

const errorHandler = function (err, req, res, next) {
  console.log('errorHandler...')
  res.status(500)
  res.send('down...')
}

app.use(errorHandler)

使用時須要注意兩點:

  • 第一,參數一個不能少,不然會視爲普通的中間件。
  • 第二,中間件須要在請求以後引用。

項目框架搭建

路由

安裝 boom 依賴(幫助咱們快速的生成一些異常信息):

➜  admin-cloud npm i -S boom
npm WARN deprecated boom@7.3.0: This module has moved and is now available at @hapi/boom. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.
npm WARN deprecated hoek@6.1.3: This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.
npm WARN admin-cloud@1.0.0 No description
npm WARN admin-cloud@1.0.0 No repository field.

+ boom@7.3.0
added 2 packages in 2.164s
➜  admin-cloud

建立 router 文件夾,建立 router/index.js:

const express = require('express')
const boom = require('boom')
const serverRouter = require('./server')
const {
  CODE_ERROR
} = require('../utils/constant')

// 註冊路由
const router = express.Router()

router.get('/', function(req, res) {
  res.send('歡迎使用雲平臺服務')
})

// 經過 serverRouter 來處理 /server 路由,對路由處理進行解耦
router.use('/server', serverRouter)

/**
 * 集中處理404請求的中間件
 * 注意:該中間件必須放在正常處理流程以後
 * 不然,會攔截正常請求
 */
router.use((req, res, next) => {
  next(boom.notFound('接口不存在'))
})

/**
 * 自定義路由異常處理中間件
 * 注意兩點:
 * 第一,方法的參數不能減小
 * 第二,方法的必須放在路由最後
 */
router.use((err, req, res, next) => {
  const msg = (err && err.message) || '系統錯誤'
  const statusCode = (err.output && err.output.statusCode) || 500;
  const errorMsg = (err.output && err.output.payload && err.output.payload.error) || err.message
  res.status(statusCode).json({
    code: CODE_ERROR,
    msg,
    error: statusCode,
    errorMsg
  })
})

module.exports = router

建立 router/server.js:

const express = require('express')

const router = express.Router()

router.get('/info', function(req, res, next) {
  res.json('server info...')
})

module.exports = router

建立 utils/constant.js:

module.exports = {
  CODE_ERROR: -1
}

修改 app.js,將router做爲中間件使用,提升代碼的靈活性,鬆耦合處理

const express = require('express')
const router = require('./router')

// 建立 express 應用
const app = express()

// 將router做爲中間件使用
app.use('/', router)

// 使 express 監聽 8000 端口號發起的 http 請求
const server = app.listen(8000, function() {
  const { address, port } = server.address()
  console.log('Http Server is running on http://%s:%s', address, port)
})

啓動服務

➜  admin-cloud node app.js
Http Server is running on http://:::8000

瀏覽器輸入:http://localhost:8000/
image-20200518232446351.png
瀏覽器輸入:http://localhost:8000/server/info
image-20200518232526603.png
瀏覽器輸入:http://localhost:8000/login
image-20200518232602994.png

至此,基礎服務環境搭建完成!!!

相關文章
相關標籤/搜索