node03
1、express处理post请求
借助body-parse中间件,其实最终我们也不会使用这个
对于get请求,无需中间件,用req.query即可返回相应的数据
但是post我们尝试借助中间件处理
const express = require('express') const es = require('express-static') const bp = require("body-parser") let server = express() server.use(bp.urlencoded({ extended: false,//是否启用扩展模式 limit: 2 * 1024 * 1024//限制接收post数据的大小,100k默认 })) //中间处理,共有2个参数 server.use('/', function (req, res) { console.log(req.body) }) server.listen(8080, () => console.log('server is running')) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <script src="./ajax.js"></script> <body> <form action="http://localhost:8080" method="post"> 用户名:<input type="text" name="user" id="user"><br /> 密码:<input type="passsword" name="pwd" id="pwd"> <input type="submit" value="登录" id="login"> </form> </body> <script> window.onload = function () { } </script> </html>
const express = require('express') const es = require('express-static') const bp = require("body-parser") let server = express() server.use(bp.urlencoded({ extended: false,//是否启用扩展模式 limit: 2 * 1024 * 1024//限制接收post数据的大小,100k默认 })) //中间处理,共有2个参数 server.use('/', function (req, res, next) {//use的第一个参数缺省,将响应所有的路径 console.log(req.body) req.a = 12 //next适用来表明需要进行下一步的链式操作的,否则直接结束响应 //进行链式操作的use的url务必一致,本函数体内数据在下一个相应的use内仍有效 next() }) server.use('/',function(){ console.log(req.a) }) server.listen(8080, () => console.log('server is running'))
2、尝试编写中间件
const express = require('express') const es = require('express-static') const bp = require("body-parser") const qs = require("querystring") let server = express() //自己编写的处理post请求的中间件 server.use(function (req, res, next) { let str = '' req.on('data', function (data) { str += data }) req.on('end', function () { req.body = qs.parse(str) next() }) }) server.use('/', function (req, res) { console.log(req.body) console.log('finished') }) server.listen(8080, () => console.log('server is running'))
2)进行封装
const qs = require("querystring") module.exports=function (req, res, next) { let str = '' req.on('data', function (data) { str += data }) req.on('end', function () { req.body = qs.parse(str) next() }) }
3)总结
const qs = require("querystring") module.exports=function (req, res, next) { let str = '' req.on('data', function (data) { str += data }) req.on('end', function () { req.body = qs.parse(str) next() }) }
4、cookie/session
session存储在服务端,比较安全,seession是基于cookie存在的
const qs = require("querystring") module.exports=function (req, res, next) { let str = '' req.on('data', function (data) { str += data }) req.on('end', function () { req.body = qs.parse(str) next() }) }
操作这两个存储需要使用到的中间件是cookie-parser cookie-session
简单地使用cookie
const express = require('express') let server = express() server.use('/', function (req, res) { res.cookie('user', 'cc', { path: '/',//哪个目录下可以读取这个cookie maxAge: 30 * 24 * 3600 * 1000//一个月有效时间 })//共三个参数:键、值、设置其他cookie参数的对象 res.send('ok啦') }) server.listen(8080, function () { console.log('server is running') })
使用签名的cookie
const express = require('express') const cp = require('cookie-parser') let server = express() server.use(cp('esfwegethg'))//密钥,必须和下面的secret对应,可省略 //cookie是可以向上访问的 server.use('/', function (req, res) { req.secret='esfwegethg' //进行签名,可以防止用户端篡改 res.cookie('user', 'blue', { signed: true })//s开头,进行了签名 console.log(req.cookies)//这里打印的是没有进行签名的cookie console.log(req.signedCookies)//这里打印的是进行签名的cookie res.send('ok啦') }) server.listen(8080, function () { console.log('server is running') })
res.clearCookie('键’)//删除cookie
使用cookie-encrypter中间件能更好地为cookie进行加密解密
但cookie一般不加密,session是强制我们进行加密的
2)使用session
const express = require('express')
const cp = require('cookie-parser')
const cs = require('cookie-session')
let server = express()
server.use(cp())
server.use(cs({
name:"cc"//自定义sesion id 键名
//必须,强制加密以保证session数据安全
keys: ['aaa', 'bbb', 'ccc'],
maxAge:24*3600*1000//设置session有效期
}))
//cookie是可以向上访问的
server.use('/', function (req, res) {
if (!req.session["count"]) {
//记录访问次数
req.session["count"] = 1
} else {
req.session["count"]++
}
console.log(req.session['count'])
res.send('ok啦')
})
server.listen(8080, function () {
console.log('server is running')
})
使用后cookie中会存有两个cookie,一个session,即session id,一个session.sig,是一个签名,
删除session:
delete req.session