express安装: `npm install express --save`
body-parser安装:`npm install body-parser` 作用是解析post请求的请求体
express创建服务器处理get/post请求:
const express = require('express')
const bodyParser = require('body-parser')
//创建服务器
const app = express()
//拦截所有请求,解析application/x-www-form-urlencoded放入req.body中
//extended为false表示用querystring解析字符串参数,为true表示用qs解析字符串参数
app.use(bodyParser.urlencoded({ extended: false }))
//拦截所有请求,解析application/json放入req.body中
app.use(bodyParser.json())
//匹配GET请求,路径为"/index"
app.get('/index', (req, res, next) => {
res.send(req.query)
})
//匹配POST请求,路径为"/add",通过req.body获取请求参数
app.post('/add', (req, res) => {
res.send(req.body)
})
//监听端口
app.listen(3000)
console.log('服务器已经启动')
body-parser还可以只针对处理某个请求:

中间件app.use以及应用场景:
中间件(Middleware)就是一个函数,它可以访问请求对象 req , 响应对象 res , 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为next 的变量。责任链模式
从上到下依次匹配
//一个http请求可以有多个中间件,通过next可以交给下一个中间件进行处理 app.get('/index', (req, res, next) => { req.name = 'eric' next() }) app.get('/index', (req, res) => { res.send(req.name) })
app.use相当于一个拦截器
/*表示匹配任何路由*/ app.use((req,res,next)=>{ console.log('这是第一个中间件') next() }) //匹配所有/index的请求,无论是get或者post app.use('/index',(req,res,next)=>{ console.log('这是第二个中间件') next() })
应用场景:
1、路由保护:客户端访问需要登录的请求时,可以使用中间件进行拦截,判断用户的登录状态,进而响应用户是否允许访问
2、网站维护:在所有中间件上定义一个接收所有请求的中间件,不使用next,直接给客户端响应表示网站维护中
3、自定义404页面
错误处理的中间件:
错误处理中间件用于处理服务器过程中的异常,因为nodejs是单线程,不能发生错误就导致服务器停止运行。
注意1、错误处理的中间件要定义在脚本最开始,因为要提前注册,如果错误已经发生了,再定义错误处理中间件就捕获不到错误
注意2、错误处理中间件无法捕获try catch了的异常,异步的异常要特殊处理
使用方法:
//错误处理中间件 app.use((err,req,res,next)=>{ res.status(500).send(err.message) })
异步的异常需要抛出,才能被错误处理中间件接受到,readFile是一个异步方法
app.get('/index', (req, res, next) => {
fs.readFile('./index.js', 'utf8', (err, result) => {
if (err) {
next(err)
return;
} else {
res.send(result)
}
})
})
router构建模块化路由:
浏览器访问地址:/user/list /user/index /blog/index
主程序:
const express = require('express')
//创建服务器
const app = express()
const user = require('./route/user')
const blog = require('./route/blog')
//将路由对象与请求地址匹配
app.use('/user',user)
app.use('/blog',blog)
//监听端口
app.listen(3000)
console.log('服务器已经启动')
路由模块user.js
const express = require('express')
//创建用户路由对象
const user = express.Router()
//创建二级路由
user.get('/list',(req,res)=>{
res.send('访问用户列表')
})
user.get('/index',(req,res)=>{
res.send('访问用户首页')
})
module.exports = user
路由模块blog.js
const express = require('express')
//创建博客路由对象
const blog = express.Router()
//创建二级路由
blog.get('/index',(req,res)=>{
res.send('访问博客首页')
})
module.exports = blog
访问静态资源:

index.js
const express = require('express')
const path = require('path')
//创建服务器
const app = express()
app.use(express.static(path.join(__dirname,'public')))
//监听端口
app.listen(3000)
console.log('服务器已经启动')
访问方式:
localhost:3000/index.html
localhost:3000/img/..
localhost:3000/css/..
express模板引擎
需要安装模板引擎:`npm install art-template express-art-template`

index.js
const express = require('express')
const path = require('path')
//创建服务器
const app = express()
//使用express-art-template渲染后缀为art的模板
app.engine('art', require('express-art-template'))
//设置模板的存放目录
app.set('views', path.join(__dirname, 'views'))
//渲染模板时默认拼接art后缀
app.set('view engine', 'art')
app.get('/index', (req, res) => {
//不用写index.art因为上面默认拼接
res.render('index', {
msg: '访问首页'
})
})
//监听端口
app.listen(3000)
console.log('服务器已经启动')
模板中使用:

浙公网安备 33010602011771号