序号 | 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-session
cnpm 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){
//获取sesssion
if(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){
//获取sesssion
if(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")); //Lenka
res.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")); //mike
res.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); //mike
res.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)