文章目录
1.什么是Express
Express是一个快速轻量级创建web服务的框架
2.安装Express
npm i express
3.使用Express
const express = require('express');//返回Express类
const app = express();//返回一个Express类型的对象
app.get('/',(req,res)=>{
res.send("Hello,World!");
})
app.get('/hello',(req,res)=>{
res.send("Hello");
})
app.listen(3000,()=>{console.log("正在监听3000端口")});
app.get()
第一个参数为URL,第二个参数为回调函数,这个函数在给指定端口使用get方法时被调用。回调函数有两个参数:request
,response
4.Node监视器
每次修改应用,我们都需要手动重启,为避免此麻烦,我们使用一个叫做nodeMon
的包,其全称为node Monitor
。
安装后使用nodemon命令运行即可
Windows系统可能会报如下错误:
nodemon : 无法加载文件 C:\Users\Zijeak\AppData\Roaming\npm\nodemon.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/
?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ nodemon index.js
+ ~~~~~~~
+ CategoryInfo : SecurityError: (:) [],PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
解决办法可以参考下面这篇博客
https://blog.csdn.net/qq_38634152/article/details/104392381
5.环境变量
app.listen(3000,()=>{console.log("正在监听3000端口")});
这句代码,我们监听了3000端口,将端口号写死的方式在开发环境可以,但部署到生产环境就可能因为动态端口分配的问题导致3000端口不一定可用。
为了解决这个问题,我们使用环境变量。
环境变量就是在进程运行是才产生的变量,它是在应用之外设置的变量。
我们需要读取环境变量的PORT
属性,为此我们要使用全局对象:process
对象。
const port = process.env.PORT || 3000
app.listen(port,()=>{console.log(`正在监听${port}端口`)});
如果PORT
设置了,我们就用它,否则就用3000
在windows系统环境下,我们使用set命令设置环境变量:
set PORT=5000
注意:这条命令一定在管理员权限下运行,否则没有作用。
6.路由参数
app.get('/book/:id',(req,res)=>{
res.send(req.params.id);
});
访问http://127.0.0.1:5000/book/1
显示结果为1
多个参数的情况也类似:
app.get('/posts/:year/:month',(req,res)=>{
res.send(req.params);
});
{“year”:“2020”,“month”:“1”}
也可以在路由规则中使用查询字符串
使用http://127.0.0.1:5000/posts/2020/1?queryWord=china
即可在req.query
属性中获取字符串参数
{“queryWord”:“china”}
7.处理HTTP GET请求
const express = require('express');//返回Express类
const app = express();//返回一个Express类型的对象
const books = [
{'id':1,'name':"三国演义"},
{'id':2,'name':"三体"},
{'id':3,'name':"围城"}
];
app.get('/',(req,res)=>{
res.send("Hello,World!");
});
app.get('/book',(req,res)=>{
res.send(books);
});
app.get('/book/:id',(req,res)=>{
const book = books.find(b => b.id === parseInt(req.params.id) );
if(!book){//404
res.status(404).send("给定的书籍ID不存在");
}else{
res.send(book);
}
});
const port = process.env.PORT || 3000;
app.listen(port,()=>{console.log(`正在监听${port}端口`)});
8.处理HTTP POST请求
app.post('/book/',(req,res)=>{
const book = {
'id':books.length + 1,
'name':req.body.name
};
books.push(book);
res.send(book);
})
在此之前,需要添加这样一行代码:
app.use(express.json());
使用Chrome插件Postman进行测试
9.验证输入
上面的代码都没有对输入内容进行验证,比如说POST请求中书名的长度过短、书名根本不存在等情况。
对于简单、数据量小的情况,我们可以手动利用if语句进行判断,进而进行处理。
但是对于复杂的应用,这样做就显得愚笨。
因此我们使用这样一个包:joi
,这个包可以帮我们轻松验证输入。
安装:npm i joi
使用:const Joi = require('joi');//返回joi类
改造后的代码:
app.post('/book/',(req,res)=>{
const schema = {
name:Joi.string().min(3).required()
};
const result = Joi.validate(req.body,schema);//这个验证方法会返回一个对象
//console.log(result);
if(result.error){
res.status(400).send(result.error.details[0].message);
}
const book = {
'id':books.length + 1,
'name':req.body.name
};
books.push(book);
res.send(book);
})
10.处理HTTP PUT请求
app.put('/book/:id',(req,res)=>{
//查找书籍
const book = books.find(b => b.id === parseInt(req.params.id) );
if(!book){//404
res.status(404).send("给定的书籍ID不存在");
}else{
res.send(book);
}
//验证
const result = validateBook(req.body);
if(result.error){
res.status(400).send(result.error.details[0].message);
return;
};
book.name = req.body.name;
res.send(book.name);
})
function validateBook(book){
const schema = {
name:Joi.string().min(3).required()
};
return Joi.validate(book,schema);//这个验证方法会返回一个对象
}
11.处理HTTP DELETE请求
app.delete('/book/:id',(req,res)=>{
//查找书籍
const book = books.find(b => b.id === parseInt(req.params.id) );
if(!book){//404
res.status(404).send("给定的书籍ID不存在");
return;
}else{
res.send(book);
}
const index = books.indexOf(book);
books.splice(index,1);
res.send(book);
});
12.联系
const Express = require("express");
const app = Express();
const Joi = require("joi");
app.use(Express.json());
var genres = [
{id:1,name:"国产"},
{id:2,name:"港澳台"},
{id:3,name:"好莱坞"},
{id:4,name:"日韩"},
{id:5,name:"泰国"},
{id:6,name:"印度"}
];
//查
app.get('/api/genres',(req,res)=>{
res.send(genres);
});
app.get('/api/genres/:id',(req,res)=>{
const result = genres.find(b => b.id === parseInt(req.params.id));
if(!result) return res.send("指定的ID不存在!");
res.send(result);
});
//增
app.post('/api/genres',(req,res)=>{
const schema = {
name:Joi.string().min(2).required()
};
const result = Joi.validate(req.body,schema);
if(result.error){
res.status(400).send(result.error.details[0].message);
}
const temp = {
id:genres.length+1,
name:req.body.name
};
genres.push(temp);
res.send(genres);
});
//改
app.put('/api/genres/:id',(req,res)=>{
//先验证存不存在
const temp = genres.find(b => b.id === parseInt(req.params.id));
if(!temp) return res.send("指定的ID不存在!");
//再验证给的值正不正确
const schema = {
name:Joi.string().min(2).required()
};
const result = Joi.validate(req.body,schema);
if(!result) return res.status(400).send(result.error.details[0].message);
//更改
temp.name = req.body.name;
res.send(genres);
});
//删
app.delete("/api/genres/:id",(req,res)=>{
//先验证存不存在
const temp = genres.find(b => b.id === parseInt(req.params.id));
if(!temp) return res.send("指定的ID不存在!");
//删除
const index = genres.indexOf(temp);
genres.splice(index,1);
res.send(genres);
});
const port = process.env.PORT || 3000;
app.listen(port,()=>{console.log(`正在监听${port}端口`)});