Express

来源:互联网 发布:机械原理动画制作软件 编辑:程序博客网 时间:2024/06/05 01:02

一、使用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/markapp.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); // OKres.send(404); // Not Foundres.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/signupapp.use('/user',user);//以/user开头,然后再到引入的路径中找到相应的内容app.listen(8080);
/** * 定义路由中间件 * 中间件里定义用户相关的路由 */let express = require('express');//调用Router方法会返回一个路由对象 就是路由中间件let router = express.Router();//路由中间件的用法和app很像 mini-approuter.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

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

原创粉丝点击