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
node03的更多相关文章
- 网站日志流量分析采集(LuaJIT系统环境部署-node03,相关jar包自己手动上传)
注:/usr/local/src 是源码包路径,可以自己更改 服务器中安装依赖 yum -y install gcc perl pcre-devel openssl openssl-devel 上传 ...
- Keepalived 配置实例
Keepalived 是一款轻量级HA集群应用,它的设计初衷是为了做LVS集群的HA,即探测LVS健康情况,从而进行主备切换,不仅如此,还能够探测LVS代理的后端主机的健康状况,动态修改LVS转发规则 ...
- Puppet3在CentOS6.5集群下的安装
环境:3台主机, IP分别为10.211.55.11.12.13 puppet master安装在10.211.55.11 puppet agent安装在10.211.55.11.12.13 1.安装 ...
- 解决zabbix图中出现中文乱码问题 图中的中文会变成方块
[root@node03 src]# wget http://down1.chinaunix.net/distfiles/ttf-arphic-uming_0.0.20050501-1.tar.gz ...
- 分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试
参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...
- 分布式架构高可用架构篇_01_zookeeper集群的安装、配置、高可用测试
参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...
- 【转载】图解:二叉搜索树算法(BST)
原文:图解:二叉搜索树算法(BST) 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!“岁月极美,在于它必然的流逝”“春花 秋月 夏日 冬雪”— ...
- 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- Advanced Awk for Sysadmins
转:http://www.linuxforu.com/2011/06/advanced-awk-for-sysadmins/ By Vishal Bhatia on June 1, 2011 in H ...
随机推荐
- 最小生成树--克鲁斯卡尔算法(Kruskal)
按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什 ...
- ASP.NET Core学习系列
.NET Core ASP.NET Core ASP.NET Core学习之一 入门简介 ASP.NET Core学习之二 菜鸟踩坑 ASP.NET Core学习之三 NLog日志 ASP.NET C ...
- iOS程序依赖管理的工具——CocoaPods
1. 简介 CocoaPods是一个负责管理iOS项目中第三方开源代码的工具,其源码在Github上开源.使用CocoaPods可以节省设置和更新第三方开源库的时间并提高工作效率. 2. CocoaP ...
- Elastichsearch实践——基本使用
官网文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/getting-started.html es中的索引.类型.文档可以 ...
- C#基于websocket-sharp实现简易httpserver(封装)
一.背景 其实就是很简单的,公司会桌面开发的人员紧缺啊,项目又赶,而我们公司的前端人员人多还厉害(ps:吐槽下,后端的人真的少啊,会桌面开发的更少啊),所以萌生出了使用html+js来构建本地应用程序 ...
- kvm虚拟机中鼠标不同步的问题解决方法
环境:Centos7.6安装kvm创建windows虚拟机,通过novnc连接到虚拟机上发现存在鼠标位置偏移问题 解决方法: 方法一: 经测试,windows系列虚拟机关闭鼠标加速亦可缓解该问题,不过 ...
- python-os创建文件夹-create_dir_if_not_exist.py
#!/bin/usr/env python3 __author__ = 'nxz' import os import argparse MESSAGE = '%s 文件夹已经存在' def creat ...
- C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...
- 解决vscode格式化vue文件出现的问题
遇到的问题 使用vscode开发vue项目的时候,格式化vue文件,与自己配置的eslint标准会有冲突. 引号问题:单引号变双引号 分号问题:行末是否加分号.自动加/减分号 当然还会有其他个性化冲突 ...
- Deepin 自动挂载win NTFS磁盘
安装了双系统 WIN10+Deepin15.4,系统开机进入Linux,刚开始在/media/my-PC里面还能看到win系统上的C.E.F盘,系统提示更新后,再次打开/media 看不见NTFS分区 ...