序号 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标头等的属性

  1. app.get('/user/:id', function(req, res) {
  2. res.send('user ' + req.params.id);
  3. });

@Response(), @Res()

@Res()只是的别名@Response()
res对象表示Express应用收到HTTP请求时发送的HTTP响应

  1. app.get('/user/:id', function (req, res) {
  2. res.send('user ' + req.params.id)
  3. })

@Next()

定义express中间件函数的时候都会将第三个参数定义为next,next函数主要负责将控制权交给下一个中间件,如果当前中间件没有终结请求,并且next没有被调用,那么请求将被挂起,后边定义的中间件将得不到被执行的机会。next()的作用就是通过放行允许程序执行多个中间件

  1. let express=require('express')
  2. let app=new express()
  3. app.use('/',function(req,res,next){
  4. res.send('Hello World');
  5. console.log('第一个')
  6. next()
  7. })
  8. app.use('/',function(req,res,next){
  9. console.log('第二个')
  10. res.send('rld');
  11. next()
  12. })
  13. app.use('/',function(req,res,next){
  14. console.log('第三个')
  15. res.send('Herld');
  16. next()
  17. })
  18. app.use('/',function(req,res,next){
  19. console.log('第四个')
  20. res.send('Helld');
  21. })
  22. app.listen(8888,function(){
  23. console.log('running.....')
  24. })

执行结果

  1. 第一个
  2. 第二个
  3. 第三个
  4. 第四个

@Session()

session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。
Session的用途:
session运行在服务器端,当客户端第一次访问服务器时,可以将客户的登录信息保存。
当客户访问其他页面时,可以判断客户的登录状态,做出提示,相当于登录拦截。
session可以和Redis或者数据库等结合做持久化操作,当服务器挂掉时也不会导致某些客户信息(购物车)
丢失

Session的工作流程

当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于
key,value的键值对,然后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),
找到对应的session(value)。 客户的信息都保存在session中

设置官方文档提供的中间件

  1. app.use(session({
  2. secret: 'keyboard cat',
  3. resave: true,
  4. saveUninitialized: true
  5. }))

使用

  1. 设置值 req.session.username = "张三";
  2. 获取值 req.session.username
  1. /*
  2. * 1.安装 express-session
  3. cnpm install express-session --save
  4. *
  5. *
  6. * 2.引入
  7. var session = require("express-session");
  8. 3.设置官方文档提供的中间件
  9. app.use(session({
  10. secret: 'keyboard cat',
  11. resave: false,
  12. saveUninitialized: true
  13. }))
  14. 4.使用
  15. 设置值
  16. req.session.username = "张三";
  17. 获取值 req.session.username
  18. * */
  19. var express = require("express");
  20. var app = express();
  21. var session = require("express-session");
  22. //配置中间件
  23. app.use(session({
  24. secret: 'keyboard cat',
  25. resave: false,
  26. saveUninitialized: true
  27. //cookie: { secure: true } /*secure https这样的情况才可以访问cookie*/
  28. }))
  29. app.get("/",function(req,res){
  30. //获取sesssion
  31. if(req.session.userinfo){ /*获取*/
  32. res.send('你好'+req.session.userinfo+'欢迎回来');
  33. }else{
  34. res.send('未登录');
  35. }
  36. });
  37. app.get("/login",function(req,res){
  38. req.session.userinfo="zhangsan111"; /*设置session*/
  39. res.send('登录成功');
  40. });
  41. app.get("/news",function(req,res){
  42. //获取sesssion
  43. if(req.session.userinfo){ /*获取*/
  44. res.send('你好'+req.session.userinfo+'欢迎回来 news');
  45. }else{
  46. res.send('未登录 news');
  47. }
  48. });
  49. 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,方法如下:

  1. var express = require('express');
  2. var app = express();
  3. app.get("/", function(req, res) {
  4. console.log(req.param("n")); //Lenka
  5. res.send("使用req.param属性获取请求根路径的参数对象值!");
  6. });
  7. app.listen(80);
  8. express deprecated req.param(name): Use req.params, req.body, or req.query instead

例2:我们也可以获取具有相应路由规则的请求对象,假设路由规则为 /user/:name/,请求路径/user/mike,如下:

  1. app.get("/user/:name/", function(req, res) {
  2. console.log(req.param("name")); //mike
  3. res.send("使用req.param属性获取具有路由规则的参数对象值!");
  4. });

PS:所谓“路由”,就是指为不同的访问路径,指定不同的处理方法。

params基本用法

和param相似,但params是一个可以解析包含着有复杂命名路由规则的请求对象的属性。
格式:req.params.参数名;
例1. 如上课时请求根路径的例子,我们就可以这样获取,如下:

  1. var express = require('express');
  2. var app = express();
  3. app.get("/user/:name/", function(req, res) {
  4. console.log(req.params.name); //mike
  5. res.send("使用req.params属性获取具有路由规则的参数对象值!");
  6. });
  7. app.listen(80);

查看运行结果,和param属性功能是一样的,同样获取name参数值。
例2:当然我们也可以请求复杂的路由规则,如/user/:name/:id,假设请求地址为:/user/mike/123,如下:

  1. app.get("/user/:name/:id", function(req, res) {
  2. console.log(req.params.id); //"123"
  3. res.send("使用req.params属性复杂路由规则的参数对象值!");
  4. });

对于请求地址具有路由规则的路径来说,属性params比param属性是不是又强大了那么一点点呢

@Query(key?: string)

用于get和delete请求,主要用于获取问号?后的参数
query是一个可获取客户端get请求路径参数的对象属性,包含着被解析过的请求参数对象,默认为{}。

  1. var express = require('express');
  2. var app = express();
  3. app.get("*", function(req, res) {
  4. console.log(req.query.参数名);
  5. res.send("测试query属性!");
  6. });
  7. 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中的参数
请求示例

  1. post("/add", {sid:sid});
  1. var bodyParser = require("body-parser")
  2. ...
  3. app.use(bodyParser.urlencoded({extended:true}))
  4. ...
  5. app.post('/add', function(req, res) {
  6. var sid = req.body.sid;
  7. console.log(sid)
  8. });

这里出现了一个新东西,bodyParser,在express 4.x中,我们需要单独引入bodyParser作为post body的解析器。在https://github.com/expressjs/body-parser 有这个模块的详细介绍。
如果是json数据提交,需要使用bodyParser.json(),文本则需bodyParser.text()(此时req.body的类型变成了字符串)。这两种在源码里均有测试。

@Headers(name?: string)

获取请求头

  1. async update(@Headers('Cache-Control') cacheControl: string)