Node 是一個基於 V8 引擎的 Javascript 運行環境,它使得 Javascript 能夠運行在服務端,直接與操做系統進行交互,與文件控制、網絡交互、進程控制等。node
Chrome 瀏覽器一樣是集成了 V8 引擎的 Javascript 運行環境,與 Node 不一樣的是他們向 Javascript 注入的內容不一樣,Chrome 向 Javascript 注入了 window 對象,Node 注入的是 global,這使得二者應用場景徹底不一樣,Chrome 的 Javascript 全部指令都須要經過 Chrome 瀏覽器做爲中介實現。git
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) })
中間件是一個函數,在請求和響應週期中被順序調用。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') })
規則主要分兩部分:
經過自定義異常處理中間件處理請求中產生的異常。
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/
瀏覽器輸入:http://localhost:8000/server/info
瀏覽器輸入:http://localhost:8000/login
至此,基礎服務環境搭建完成!!!