Express的使用

By Cicades

post-cover

Express的使用

1. 基本使用

//引包
var express = require('require')

//创建app
var app = express()

//路由
app.get('/', function(req, res){
    console.log(req.query) //获取url中的query
    res.redirect('/') //重定向到‘/’
    res.send('hello world')//原有api依然可以使用
})
app.post('/', function(req, res){

})
//开放静态资源
app.use('/public/', expresss.static('./public/'))//开放当前目录中public文件夹中的资源,指定的url规则可以和静态资源的文件名不同

//监听端口
app.listen(3000, function(){
    console.log('server is running!')
})

1.1 修改代码后自动重启服务器

# 安装第三方命令行工具 会监听文件的修改
npm install --global nodemon 
# nodemon 代替 node 执行文件
nodemon app.js

1.2 在express中使用art-template

  • 安装

    npm i art-template -S
    npm i express-art-template -S
    
  • 使用

    //指定被渲染的文件后缀名为art,可以被修改
    app.engine('art', require('express-art-template'))
    //在路由的回调函数中调用res.render('filename'),指定被渲染且被响应的文件
    app.get('/', function(res, req){
        res.render('index.html'[ ,object]) //会默认去views文件夹下寻找index.html文件
    })
    

1.3 获取post请求体中的数据

express并没有提供api获取post请求体中的数据,要依赖middleware–body-parser

  • 安装
    npm i body-parser -S
    
  • 配置

    var express = require('express')
    var bodyParser = require('body-parser')
    
    var app = express()
    
    // parse application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded({ extended: false }))
    
    // parse application/json
    app.use(bodyParser.json())
    
    app.use(function (req, res) {
      res.setHeader('Content-Type', 'text/plain')
      res.write('you posted:\n')
      res.end(JSON.stringify(req.body, null, 2))
    })//配置结束,可用req.body获取请求体中(对象)数据
    

1.4 Express的中间件的使用

所谓中间件就是处理http的响应和请求的中间程序,express的中间件分为三种,分别是全局匹配,严格匹配,url匹配

  • 全局匹配

    express.use(function(res, rep, next){
        //这种匹配方式没有限制条件,请求响应都会经过它的处理,且同一次请求中,中间件所使用的`res,req`都是同一对象
        next() //调用next()才会进入到下一个匹配到的中间件
      })
    
  • url匹配

    express.use('/public', function(res, req, next) {
      // 只用当url是以`/public`开头才会进入到次中间件
      //TODO: ...
      next()
      })
    
  • 严格匹配

    express.get('/', function(res, req, next) {
      //只有当请求方式是get且请求的url为`/`,才会进入到此中间件
      })
    express.post('/', function(res, req, next) {
      //请求为post,且url为/
      next()
      })
    
  • 中间应用-统一错误处理,404处理

    //统一错误处理
    express.use(function(erro, res, req, next) {
      // 当`function`的参数为四个, 才会被认为是错误处理中间
      //当其他中间件使用next`(erro)`时会直接进入到此中间件
      })
    
    //404处理, 设置一个全局中间放在所有中间的最后,用来处理404
    express.use(function(res, req) {
      //TODO:...
      })
    

2. Express多人社区案例

github地址目前只完成了登录,注册,退出功能😭

2.1 __filenamedirname

  • __filenamedirname可以动态获取当前文件所处的文件路径,因为在文件操作模块中所涉及到的文件资源的相对路径,实际上是以shell运行node的所处路径为参考对象,所以为了文件操作所设涉及的路径都应使用__filenamedirname

2.2 session的使用

  • http是无状态的,所以需要借助session记录用户的登录状态,express需要配置express-session中间件才能使用session
  • 具体用法
    app.use(session({
    // 配置加密字符串,它会在原有加密基础之上和这个字符串拼起来去加密
    // 目的是为了增加安全性,防止客户端恶意伪造
    secret: 'cicades',
    resave: false,
    saveUninitialized: false // 无论你是否使用 Session ,我都默认直接给你分配一把钥匙
    }))
    //配置完成后即通过res.session.xxx = xxx,来添加session
    

2.3 art-template的扩展用法

  • extend-模板继承
  • include-模块引用
  • block-配和继承使用,可在继承过来的模板上添加个性化内容

2.4 通过异步请求触发的重定向是无效的