| 序号 | nest.js装饰器 | express |
|---|---|---|
| 1 | @Request() |
req |
| 2 | @Response(), @Res()* |
res |
| 3 | @Next() |
next |
| 4 | @Session() |
req.session |
| 5 | @Param(key?: string) |
req.params / req.params[key] |
| 6 | @Body(key?: string) |
req.body / req.body[key] |
| 6 | @Query(key?: string) |
req.query / req.query[key] |
| 8 | @Headers(name?: string) |
req.headers / req.headers[name] |
对应的express文档
http://www.expressjs.com.cn/4x/api.html#req
http://www.expressjs.com.cn/4x/api.html#res
@Request()
该req对象表示HTTP请求,并具有请求查询字符串,参数,正文,HTTP标头等的属性
app.get('/user/:id', function(req, res) {res.send('user ' + req.params.id);});
@Response(), @Res()
@Res()只是的别名@Response()
该res对象表示Express应用收到HTTP请求时发送的HTTP响应
app.get('/user/:id', function (req, res) {res.send('user ' + req.params.id)})
@Next()
定义express中间件函数的时候都会将第三个参数定义为next,next函数主要负责将控制权交给下一个中间件,如果当前中间件没有终结请求,并且next没有被调用,那么请求将被挂起,后边定义的中间件将得不到被执行的机会。next()的作用就是通过放行允许程序执行多个中间件
let express=require('express')let app=new express()app.use('/',function(req,res,next){res.send('Hello World');console.log('第一个')next()})app.use('/',function(req,res,next){console.log('第二个')res.send('rld');next()})app.use('/',function(req,res,next){console.log('第三个')res.send('Herld');next()})app.use('/',function(req,res,next){console.log('第四个')res.send('Helld');})app.listen(8888,function(){console.log('running.....')})
执行结果
第一个第二个第三个第四个
@Session()
session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。
Session的用途:
session运行在服务器端,当客户端第一次访问服务器时,可以将客户的登录信息保存。
当客户访问其他页面时,可以判断客户的登录状态,做出提示,相当于登录拦截。
session可以和Redis或者数据库等结合做持久化操作,当服务器挂掉时也不会导致某些客户信息(购物车)
丢失
Session的工作流程
当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于
key,value的键值对,然后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),
找到对应的session(value)。 客户的信息都保存在session中
设置官方文档提供的中间件
app.use(session({secret: 'keyboard cat',resave: true,saveUninitialized: true}))
使用
设置值 req.session.username = "张三";获取值 req.session.username
/** 1.安装 express-sessioncnpm install express-session --save*** 2.引入var session = require("express-session");3.设置官方文档提供的中间件app.use(session({secret: 'keyboard cat',resave: false,saveUninitialized: true}))4.使用设置值req.session.username = "张三";获取值 req.session.username* */var express = require("express");var app = express();var session = require("express-session");//配置中间件app.use(session({secret: 'keyboard cat',resave: false,saveUninitialized: true//cookie: { secure: true } /*secure https这样的情况才可以访问cookie*/}))app.get("/",function(req,res){//获取sesssionif(req.session.userinfo){ /*获取*/res.send('你好'+req.session.userinfo+'欢迎回来');}else{res.send('未登录');}});app.get("/login",function(req,res){req.session.userinfo="zhangsan111"; /*设置session*/res.send('登录成功');});app.get("/news",function(req,res){//获取sesssionif(req.session.userinfo){ /*获取*/res.send('你好'+req.session.userinfo+'欢迎回来 news');}else{res.send('未登录 news');}});app.listen(3000);
具体参考
https://blog.csdn.net/cckevincyh/article/details/79816491
@Param(key?: string)
用于get和delete请求,主要用于获取分号:参数和query用于处理问号?参数相区别
param基本用法
和属性query一样,通过req.param我们也可以获取被解析过的请求参数对象的值。
格式:req.param(“参数名”);请求路径如下示例:
例1: 获取请求根路径的参数值,如/?n=Lenka,方法如下:
var express = require('express');var app = express();app.get("/", function(req, res) {console.log(req.param("n")); //Lenkares.send("使用req.param属性获取请求根路径的参数对象值!");});app.listen(80);express deprecated req.param(name): Use req.params, req.body, or req.query instead
例2:我们也可以获取具有相应路由规则的请求对象,假设路由规则为 /user/:name/,请求路径/user/mike,如下:
app.get("/user/:name/", function(req, res) {console.log(req.param("name")); //mikeres.send("使用req.param属性获取具有路由规则的参数对象值!");});
PS:所谓“路由”,就是指为不同的访问路径,指定不同的处理方法。
params基本用法
和param相似,但params是一个可以解析包含着有复杂命名路由规则的请求对象的属性。
格式:req.params.参数名;
例1. 如上课时请求根路径的例子,我们就可以这样获取,如下:
var express = require('express');var app = express();app.get("/user/:name/", function(req, res) {console.log(req.params.name); //mikeres.send("使用req.params属性获取具有路由规则的参数对象值!");});app.listen(80);
查看运行结果,和param属性功能是一样的,同样获取name参数值。
例2:当然我们也可以请求复杂的路由规则,如/user/:name/:id,假设请求地址为:/user/mike/123,如下:
app.get("/user/:name/:id", function(req, res) {console.log(req.params.id); //"123"res.send("使用req.params属性复杂路由规则的参数对象值!");});
对于请求地址具有路由规则的路径来说,属性params比param属性是不是又强大了那么一点点呢
@Query(key?: string)
用于get和delete请求,主要用于获取问号?后的参数
query是一个可获取客户端get请求路径参数的对象属性,包含着被解析过的请求参数对象,默认为{}。
var express = require('express');var app = express();app.get("*", function(req, res) {console.log(req.query.参数名);res.send("测试query属性!");});app.listen(80);
通过req.query获取get请求路径的对象参数值。
格式:req.query.参数名;请求路径如下示例:
api/search?username=Lenka&company=alibaba
req.query.username // “Lenka”
req.query.company // “alibaba”
@Body(key?: string)
获取Post中的参数
请求示例
post("/add", {sid:sid});
var bodyParser = require("body-parser")...app.use(bodyParser.urlencoded({extended:true}))...app.post('/add', function(req, res) {var sid = req.body.sid;console.log(sid)});
这里出现了一个新东西,bodyParser,在express 4.x中,我们需要单独引入bodyParser作为post body的解析器。在https://github.com/expressjs/body-parser 有这个模块的详细介绍。
如果是json数据提交,需要使用bodyParser.json(),文本则需bodyParser.text()(此时req.body的类型变成了字符串)。这两种在源码里均有测试。
@Headers(name?: string)
获取请求头
async update(@Headers('Cache-Control') cacheControl: string)
