express 基础API 及其用法

545 阅读4分钟

创建application

要首先安装express cnpm install express

    let express = require('express');
    let app = express();

解析请求体

app.use() 用来在 express 中 添加中间件

    app.use('/', function(req, res, next){ // 第一个参数 路径 可以不传 默认 / 第二个是中间件回调 所有包含/的请求都会进入到这个函数/admin /app
        // req 是express 内部的封装的请求对象
        // res 是 express 内部封装的相应对象
        // next 是否调用next 决定是不是能继续调用后面的 接口或中间件
    })
     app.use(function(err, req, res, next){ // 第一个参数 路径 可以不传 默认 / 第二个是中间件回调
        // 当只传入回调 并且有4个参数的时候 为错误处理中间件
        // req 是express 内部的封装的请求对象
        // res 是 express 内部封装的相应对象
        // next 是否调用next 决定是不是能继续调用后面的 接口或中间件
    })

使用中间件 body-parser 来解析请求体,安装 cnpm i body-parser

    app.use(bodyParser.json()); // application/json
    app.use(bodyParser.urlencoded({ extended: true })); // 解析 application/x-www-form-urlencoded  extended true 使用querystring false 使用 qs
    app.use(bodyParser.raw())  // 用于解析二进制数据
    app.use(bodyParser.text()) // 用于解析html/text
    // 特殊用法 把text/html 用 json 来解析
    app.use(bodyParser.text({ type: 'text/html' }))

权限校验

为什么会有cookie 和 session 出现 为了解决http 无状态问题 即不知道请求的时候是不是还有权限访问当前服务 cookie 和 session 用于记录状态 cookie 和 session的区别就是 前者存储在前端 后者 存储在后端

  • 使用cookie-parser cnpm i cookie-parser 来解析cookie
    let cookieParser = require('cookie-parser');
    app.use(cookieParser('key')); // 如果需要签名 则需要配置密钥

使用 express-session 来管理session。cnpm i express-session session 可以使用cookie 发送到前端 一般这时的cookie 的有效期设置为0; 即回话期间有效。 也可以重写url。

  let session = require('express-session');
  app.use(session({
    secret: '12345', // 加密的密钥 1.5.0后不依赖cookie-parser
    name: 'testapp',   //这里的name值得是cookie的name,默认cookie的name是:connect.sid
    cookie: {maxAge: 0},  //设置
    resave: false, // 是否重新生成 session 一般不要
    saveUninitialized: true, // 是否报错未初始化的session 如果为false 则rolling true 不会刷新为初始化的session  设置为true 可以设置验证码登陆
    rolling: true, // 每次发送来新的请求则刷新失效时间
    // 可以存到数据库
   // store: new MongoStore({   //创建新的mongodb数据库
    //     host: 'localhost',    //数据库的地址,本机的话就是127.0.0.1,也可以是网络主机
    //    port: 27017,          //数据库的端口号
    //     db: 'test-app'        //数据库的名称。
    // })
 }));
 // 通过req.session 来获取session  如果存在了session 则可以获取到
 app.get('/', function(req, res, next) {
  if (req.session.views) {
    req.session.views++
    res.setHeader('Content-Type', 'text/html')
    res.write('<p>views: ' + req.session.views + '</p>')
    res.write('<p>expires in: ' + (req.session.cookie.maxAge / 1000) + 's</p>')
    res.end()
  } else {
    req.session.views = 1
    res.end('welcome to the session demo. refresh!')
  }
})
  • 除了使用session 还可以使用 jwt 类进行身份验证 cnpm i jsonwebtoken
    let jwt = require('jsonwebtoken');
    // 生成token
    let token = jwt.sign({exp: Math.floor(Date.now() / 1000) + 30,
        data: {username, password}}, SECRET)
        res.end({token});
    // token 校验
    jwt.verify(req.query.tokenm, SECRET, (err, decode) => {
      res.json({token: decode})
    })

请求处理

  • 使用app
    app.all('/user', function (req, res, next) { // 不管何种请求方式 /user 路径的请求都进入和use 的区别 就是 路径必须全等
        // req 封装的请求对象
        // res 相应对象
      console.log('although this matches');
      next();
    });
    app.get('/user/:id', function (req, res, next) {
        // req 封装的请求对象
        // res 相应对象
      console.log('although this matches');
      next();
    });
    
    app.get('/user/:id', function (req, res) {
      console.log('and this matches too');
      res.end();
    });
    
    // 当使用了body-parser 来解析 form表单数据 则会把参数放到 req.body
    app.post('/api/:id', (req, res, next) => {
      res.cookie('my-cookie', 'value123', { signed: true });
      let {headers, body, params, cookies, ip, signedCookies} = req;
      // res.download(path.resolve(__dirname, './html/1.txt'), '1.txt', function(err) {
      //   if (err) console.log('err', chalk.red(err));
      // });
      res.end(JSON.stringify({path: req.path, headers, body, cookies, params, ip, signedCookies}));
    });
  • 解析form-data 使用 multer cnpm i multer
    const multer = require('multer');
    // dest 存放文件的目录 limits 限制上传文件的大小
    const upload = multer({ dest: 'files/', limits: 100000000000 });  
    
    router.post('/upload', upload.single('file'), function(req, res) {
        let oldPath = path.resolve(req.file.path);
        let newPath = path.resolve(req.file.destination, req.file.originalname);
        fs.rename(oldPath, newPath, (err) => { // 修改文件名称
          console.log('err', err)
        })
    res.json({status: '00011'})
  })

关于 res

  //  res.json({a: 1}); // 会设置json 请求头 并发送数据
  //  res.jsonp({a: 1});  // 会把参数给jsonp 的回调
  //  res.send(); // 可以写入任意内容 buffer json string 并且根据内容类型设置 请求头 
  // res.header("Content-Type", "application/json;charset=utf-8"); // 设置请求头

关于相应头的content-type 可以使用 mime 类解析文件的类型 cnpm i mime

let mine = require('mime');
mime.getType('js') // 'application/javascript'

监听端口

    app.listen(5002, () => {})