Express

一、使用express

本地安装

$ npm install express

获取、引用通过变量app就可以调用express的各种方法

let express=require('express');//引入express模块,用来帮助我们创建http服务器
let app=express();//express是一个函数,需要执行才能都得到应用的函数,app也是一个函数

//请求监听函数,当客户端向服务器发送请求时执行的回调函数
app.listen(3000,function(){
  console.log('服务器已经启动,监听3000端口');
});

二、路由

优点
- 根据客户端的不同请求路径返回不同的内容
- 简单,好维护
- 结构清晰

http请求的方法

GET/POST/PUT/DELETE
例如:GET语法(其他的方法也类似)
app.get(path,function(request,response));
- 第一个参数path:请求路径
-第二个参数为请求的回调函数,有两个参数分别是:

  • request(req):代表客户端请求信息
  • response(res): 代表服务器响应信息
let express=require('express');
let app=express();
//app上也可以调用一些方法,用这些方法来定义路由
//当服务器收到客户端请求后,先由app来进行处理,app不具体响应请求,而是进行判断应该由哪个路由来处理
app.get('/',function(req,res){
   res.end('home');
});

app.post('/user',function(req,res){
   res.end('post');
});
app.put('/user',function(req,res){
  res.end('put');
});
app.delete('/user',function(req,res){
  res.end('delete');
})

app.listen(3000);

app.all()函数

all: 表示匹配所有的方法和所有的路径

app.all('*',function(req,res){
  res.end('404');
});

三、获取请求参数

例如:htpp://localhost:8080/signup?name=alice&&age=9

req.method: 返回请求的方式
req.url: 返回完整的URL路径,包括路径名(pathname)+查询字符串(query)=>/signup?name=alice&&age=9
req.path: 相当于路径名,就是端口号和问号中间的那部分=>/signup
req.query: 请求体的内容 => {name:’alice’,age:9}
req.headers: 设置请求头对象 (相当于之前的res.setHeader)
req.host : 返回请求头里取的主机名(不包含端口号)

简单的登录注册例子

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

app.get('/signup',function(req,res){
  res.header('Content-Type','text/html;charset=utf8');
  //设置请求头内容的格式,避免出现中文乱码现象
res.end(`
    <form action="/signup" method="POST">
    用户名 <input type="text" name="name"><br/>
    密码 <input type="text" name="password"><br/>
    <input type="submit">
    </form>
  `);
});

//通过发送post请求就可以提交用户提交的注册信息
app.post('/signup',function(req,res){   //req是一个可读流
var str='';
req.on('data',function(chunk){
str+=chunk.toString();
});
req.on('end',function(req,res){
 res.end(str);
});
});
app.listen(3000);

获得查询字符串

//http://localhost:3000/?a=1&b=2&c=3
app.get(‘/’,function(req,res){
res.end(util.inspect(req.query));
});

paramas路径参数

//id:称为路径参数
////http://localhost:3000/user/ID/mark
app.get('/user/:id/:name',function(req,res){

/* let id=req.params.id;
 *let name=req.paramas.name;
 *res.end(id+name);
*/
 res.send(req.params.id+" "+req.params.name);
})

next函数

app.param('num1',function(req,res,next,num1){
  //把字符串转成数字赋给了请求对象的num1属性
   req.num1 = parseInt(num1);
   next();//表示继续向下执行
})
app.param('num2',function(req,res,next,num2){
  //把字符串转成数字赋给了请求对象的num1属性
  req.num2 = parseInt(num2);
  next();//表示继续向下执行,一直到全部的next执行结束后才会去执行下面是代码
})
//num1 num2 是两个占位符 表示匹配路径;/add/任意字符串/任意字符串
app.get('/add/:num1/:num2',function(req,res){
  res.end('和是:'+(req.num1+req.num2));
});
app.get('/minus/:num1/:num2',function(req,res){
  res.end('差是'+(req.num1-req.num2));
});

send&&sendFile

send方法向浏览器发送一个响应信息,并可以智能处理不同类型的数据 并在输出响应时会自动进行一些设置,比如HEAD信息、HTTP缓存支持等等。

 语法:   res.send([body|status], [body])

例 1

1.当参数为一个String时,Content-Type默认设置为”text/html”

res.send('Hello World'); //Hello World

2.当参数为Array或Object时,Express会返回一个JSON

res.send({ user: 'tobi' }); //{"user":"tobi"}
res.send([1,2,3]); //[1,2,3]

3.当参数为一个Number时,并且没有上面提到的任何一条在响应体里,Express会帮你设置一个响应体,比如:200会返回字符”OK”
require(‘_http_server’).STATUS_CODES (引入模块)

res.send(200); // OK
res.send(404); // Not Found
res.send(500); // Internal Server Error

例2

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

//方式一:(直接通过设置获取的路径,最后返回相应的内容)
let users=[{name:'mark',age:9}];
app.get('/users',function(req,res){
 res.send(users);
});

//方式二:(在当前文件新建一个users.json文件,并且写入要读取的内容)
let path=require('path');
app.get('/users',function(req,res){
 res.sendFile(path.resolve('./users.json'));//设置绝对路径

//方式三:
res.sendFile('./users.json',{root:__dirname});// 设置根目录
});
let app.listen(8080);

设置状态码

app.get('/other',function(req,res){
 //res.statusCode = 404;//设置状态码
 //  res.status(404);//要用来设置响应状态码;但是这个在浏览器发送请求时,浏览器会一直不停地加载,因为res.status中没有end的方法,没法返回结果
  res.sendStatus(404);//send里面有end方法,所以相对于status,sendStatus会自动返回
})

四、中间件

中间件就是处理HTTP请求的函数,用来完成各种特定的任务(以及一些公共逻辑),比如检查用户是否登录、检测用户是否有权限访问等,它的特点是:

  • 一个中间件处理完请求和响应可以把数据在传递给下一个中间件
  • 回调函数的next参数是一个函数,调用表示调用后续的中间件并将数据传递给下一个中间件
  • 还可以根据路径区分进行返回执行不同的中间件
let express=require('express'):
let app=express();

//use表示使用一个中间件函数
//next是一个方法,表示继续向下执行,只有当中间件函数执行完成后,才会去执行实际要操作内容的代码
app.use(function(req,res,next){
  res.header('Content-Type','text/html;charset=utf8');

fs.readFile('1.txt','utf8',function(err,data){
  if(err){
     next(err);
  }
  else{
   res.msg=data;
   next();
   }
});
app.get('/',function(req,res){
  res.end('首页');
});
app.get('/user',function(req,res){
  res.end('用户管理');
});

//错误处理中间件多了一个参数err,只有当中间件中去读取文件时出现错误才会走下面的函数
app.use(function(err,req,res,next){
  console.error(err);
});

app.listen(8080);

next的原理

let stack =[
  function(req,res,next){
    console.log(1);
    next();
  },
  function(req,res,next){
    console.log(2);
    next();
  },
  function(req,res,next){
    console.log(3);
    next();
  }
]
let i=0;
function next(){
  let fn = stack[i++];
  if(fn)
    fn(null,null,next);
}
next();
路由中间件的使用

* 路由中间件*:这是一个中间件 ,用来提供路由功能,解决的是路由的集中配置问题,能把不同的类型的路由配置到不同的文件里面去

let express = require('express');
let user = require('./routes/user'); //在routes文件夹下引入user.js 
let app = express();
//当服务器收到客户端请求的时候,会判断请求路径是不是以/user开头,如果是以/user开头,会交给user中间件来处理
// /user/signup
app.use('/user',user);//以/user开头,然后再到引入的路径中找到相应的内容
app.listen(8080);
/**
 * 定义路由中间件
 * 中间件里定义用户相关的路由
 */
let express = require('express');
//调用Router方法会返回一个路由对象 就是路由中间件
let router = express.Router();
//路由中间件的用法和app很像 mini-app
router.get('/signup',function(req,res){
  res.send('注册');
});
module.exports = router;//将路由导出

五、静态文件服务器

如果要在网页中加载静态文件(css、js、img),就需要另外指定一个存放静态文件的目录,当浏览器发出非HTML文件请求时,服务器端就会到这个目录下去寻找相关文件

用法
1.app.use(express.static(path.join(__dirname,’/’)));
2. app.use(‘/static’,express.static(path.resolve(‘public’)));
都是设置的根路径,第二种的第一个参数是用来判断路径是不是以/static开头,即:http://localhost:8080/static

重定向

redirect方法允许网址的重定向,跳转到指定的url并且可以指定status,默认为302方式。

语法 :res.redirect([status], url);

app.get('/baidu',function(req,res){
  res.redirect('http://www.baidu.com');
});

六、curl客户端使用方法

  • 指定请求头
  • curl -H 'content-type:application/json;charset=utf-8' http://localhost:8080/users
  • 指定方法名
  • curl -X POST http://localhost:8080/users
  • 指定请求体
  • curl --data "name=mark&age=8" http://localhost:8080/users

注释
自己总结的知识点,有不好的地方希望大家能提出意见~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值