sunyongjian/blog

express 学习

sunyongjian opened this issue · 0 comments

express

首先要知道express是干什么的。他是我们nodejs使用的框架,就跟我们前端js要用angular一样,这是后端的框架,可以简化我们的代码,实现快速,简单的开发。另外,express 跟其他的工具搭配,会更强。比如第三方中间件,因为express只有一个内置的static 来处理静态文件的中间件。比如学过的bodyParser (处理json和查询字符串)

app

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

app.get('/', function(req, res){
  res.send('im SYJ');
});

app.listen(8080);
  • app.locals 一个用来存储属性的空对象
    当模板渲染对象时,会将locals和 我们传在render里的对象 合并为一个。
    当我们在locals 中设置属性,所有的模板就都有这个属性了。
    感觉后续用法有待开发

  • app.use 使用中间件 第一个参数可以是具体的设置路径,第二是callback

  • app.get 可以获取app.set()设置的值、设置路由

  • app.post 设置post请求路由

  • app.all('*') all + '*' 表示所有请求

  • app.route 设置路由

var app = express();

app.route('/events')
.all(function(req, res, next) {
 path '/events' 的路由前执行,可以设定中间件

})
.get(function(req, res, next) {
  res.send(...);
})
.post(function(req, res, next) {
  
})

Request

  • req.body 请求体
    通常请求体 中的数据需要用事件监听来获取。第三方中间件可以自带监听并处理。比如body-parser中的json()来处理json格式的,urlencoded({ extended: true }) 来处理查询字符串 Multer处理http提交multipart/form-data,也就是文件上传

拓展 multipart/form-data 常用的表单上传文件的方式,比如写邮件添加附件。发送的也是字符串,只不过不是常见的key=value那种,而是加了分隔符等内容的构造体 --开始-- --分割-- -- 结尾--

  • req.path 请求路径-->pathname
  • req.method 请求方式
  • req.hostname 请求主机名 -->www.baidu.com
  • req.query 请求的查询字符串
  • req.headers 请求头
  • req.params 请求路径参数
    如果我们写了一个route (路由) 是user/:name/:name2
    第二个路径名就可以req.params.name这样取到。带: 的都会以 key value 的方式 {name:'',name1:''} 放到req.params中。

Response

  • res.end 结束response进程 相当于nodejs中的end
  • res.send 结束并返回数据。 参数支持对象格式的,数字,以及字符串。
  • res.json 结束并JSON.stringify 你的参数,比如res.json({name:22})
  • res.status(code) res.status(403).end();
  • res.set() 设置响应头
    res.set('Content-Type', 'text/plain');

    res.set({
        'Content-Type': 'text/plain',
        'Content-Length': '123',
        'ETag': '12345'
        })
        //对象里面重复的后面会把前面的覆盖
    res.set('Set-Cookie','name=syj')
  • res.get() 获取设置的属性值
   res.get('Content-Type'); //text/plain
  • res.render 读取模板引擎 并且返回给客户端
    支持三个参数,(view [, locals] [, callback])
    第一个参数是读取的模板文件名,第二个是需要替换的属性值,{username:'SYJ'} 第三个是callback 后面两个参数可以不传。
app.get('/contact',function(req,res){
    res.render('contact',{msg:'contact'});
});
  • res.cookie(name,value,options)

Sets cookie name to value

header 1 | header 2

Property Type Description
domain String 只有访问domain对应的域名才会设置cookie
expires Date 也代表cookie的生存期,value是一个过期时间 比如new Date(Date.now()+20*1000)}) 不写或者设0默认为会话cookie,存在客户端内存中
httpOnly Boolean 仅在http协议下设定cookie
maxAge String 设置cookie过期时间,倒计时 设置毫秒
path String 只有访问path对应的路径才会设置cookie,默认'/'
secure Boolean 仅 在https协议下有cookie
signed Boolean 是否有签名。需要 使用中间件添加秘钥 1.app.use(cookieParser('syj'));2.res.send(req.signedCookies);此时cookie在req.signedCookies上

中间件

  • 内置static('/root',{options})
  • body-parser 第三方 用来处理请求体中的数据,require并使用 use这个中间件,会自动处理post请求 ,request.body 中的数据。json字符串,查询字符串都转化为对象
var bodyParser=require('body-parser');
app.use(express.bodyParser())
var multer = require ( 'multer' )
app.use(multer({ dest: './uploads/' }))
  • cookie-parser 处理请求头中的cookie,并把其转化为对象,放到request上。在use这个中间件下面都可以用request.cookies 取到传过来的cookie。。。
    原生使用request.headers['cookie'] 取到一个字符串'; '分割的
    另外 response.cookie可以设置cookie,注意区分。
    response.cookie(name,value,{options})..
    原生只能使用
 res.setHeader('Set-Cookie',"age=6; Domain=localhost");
var cookieParser = require('cookie-parser');
app.use(cookieParser()) 
//支持传秘钥参数
  • session-parser
    虽然session与cookie是分开保存的.但是session中的数据经过加密处理后默认保存在一个cookie中.因此在使用session中间件之前必须使用cookieParser中间件.
    使用了 session-parser中间件以后,requset.session上就有了session的所有属性.........
    原生的话是先从cookie上 取出sessionid对应的值,这个值保存在我们后台对象中,作为 key。所有通过对象 obj.key 可以取出它对应的信息。
var session = require('express-session');
app.use(session({options}))
//options参数的具体取值:

key:字符串,用于指定用来保存session的cookie名称,默认为coomect.sid.

store:属性值为一个用来保存session数据的第三方存储对象.

fingerprint:属性值为一个自定义指纹生成函数.

cookie:属性值为一个用来指定保存session数据的cookie设置的对象,默认值为{path:/,httpOnly:true,maxAge:14400000}.

path是cookie保存路径.httpOnly是否只针对http保存cookie,

maxAge用于指定cookie的过期时间,单位为毫秒.

secret:字符串.用来对session数据进行加密的字符串.这个属性值为必须指定的属性.