要一直走下去

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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('服务器已经启动')

模板中使用:

 

 

 

 

 

 

posted on 2022-07-16 21:41  要一直走下去  阅读(68)  评论(0)    收藏  举报