前言:最近在学习Vue+Element UI+Node.js小慕读书中后台管理系统开发课程,这里对学习过程作个笔记,方便自己和大家翻阅。
一、Node 简介
- Node 是一个基于 V8 引擎的 Javascript 运行环境,它使得 Javascript 可以运行在服务端,直接与操作系统进行交互,与文件控制、网络交互、进程控制等
- 与Chrome的区别:Chrome 浏览器同样是集成了 V8 引擎的 Javascript 运行环境,与 Node 不同的是他们向 Javascript 注入的内容不同,Chrome 向 Javascript 注入了 window 对象,Node 注入的是 global,这使得两者应用场景完全不同,Chrome 的 Javascript 所有指令都需要通过 Chrome 浏览器作为中介实现
二、Express 简介
- express 是一个轻量级的 Node Web 服务端框架,同样是一个人气超高的项目,它可以帮助我们快速搭建基于 Node 的 Web 应用
三、项目初始化
创建项目
mkdir admin-imooc-node cd admin-imooc-node npm init -y
安装依赖
npm i -S express
创建 app.js
const express = require('express') // 创建 express 应用 const app = express() // 监听 / 路径的 get 请求 app.get('/', function(req, res) { res.send('hello node') }) // 使 express 监听 5000 端口号发起的 http 请求 const server = app.listen(5000, function() { const { address, port } = server.address() console.log('Http Server is running on http://%s:%s', address, port) })
四、Express 三大基础概念
中间件
中间件是一个函数,在请求和响应周期中被顺序调用
1.next()一定要调用,否则中间件是不会继续向下执行的
2.中间件一定要在请求发起之前执行,否则中间件就执行不到了
// 前置中间件:跨域、日志等操作 function myLogger(req, res, next){ console.log('myLogger') next() } app.use(myLogger) //中间件需要在响应结束前被调用 /**********************************************************/ // 监听 / 路径的 get 请求 app.get('/', function(req, res) { res.send('hello node') })
路由
应用如何响应请求的一种规则
1.响应 / 路径的 get 请求:
app.get('/', function(req, res) { res.send('hello node') })
2.响应 / 路径的 post 请求:
app.post('/', function(req, res) { res.send('hello node') })
规则主要分两部分:
- 请求方法:get、post......
- 请求的路径:/、/user、/.*fly$/......
异常处理
通过自定义异常处理中间件处理请求中产生的异常
// 监听 / 路径的 get 请求 app.get('/', function(req, res) { //请求响应res已经被响应到,当响应结束,不会执行中间间 throw new Error('something has error...') }) /***********************************************************? // 后置中间件:异常处理 // 后置原因: 前面的throw new Error会寻找后面的errorHandler,倒置则找不到 function errorHandler(err, req, res, next){ console.log(err) res.status(500).json({ error: -1, msg: err.toString() }) } app.use(errorHandler)
使用时需要注意两点:
- 第一,参数一个不能少,否则会视为普通的中间件
- 第二,中间件需要在请求之后引用
五、项目框架搭建
路由
安装 boom 依赖: (最大的好处:快速生成异常信息)
npm i -S boom
创建 router 文件夹,创建 router/index.js:(用来处理全局的异常)
const express = require('express') const boom = require('boom') const userRouter = require('./user') const { CODE_ERROR } = require('../utils/constant') // 注册路由 const router = express.Router() router.get('/', function(req, res) { res.send('欢迎学习小慕读书管理后台') }) // 通过 userRouter 来处理 /user 路由,对路由处理进行解耦 router.use('/user', userRouter) /** * 集中处理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
修改app.js
const express = require('express') const router = require('./router') // 创建 express 应用 const app = express() app.use('/', router) // 监听 / 路径的 get 请求 //app.get('/', function(req, res) { // res.send('hello node') //}) // 使 express 监听 5000 端口号发起的 http 请求 const server = app.listen(5000, function() { const { address, port } = server.address() console.log('Http Server is running on http://%s:%s', address, port) })
创建 router/use.js:
const express = require('express') const router = express.Router() router.get('/info', function(req, res, next) { res.json('user info...') }) module.exports = router
创建 utils/constant:
module.exports = { CODE_ERROR: -1 }
验证 /user/info:(路由嵌套)
验证 /user/login:
注:项目来自慕课网