一、使用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
注释:
自己总结的知识点,有不好的地方希望大家能提出意见~~~