(一)创建网站服务器
(二)请求
1.路由
2.路由抽出到单独js写
3.中间件定义
4.中间件案例:请求地址前必须先登陆
5.中间件案例:错误处理中间件(5.1同步+5.2异步+5.3异步改同步)
6.请求参数:(1)get参数(2)post参数
(三)处理内容
1.处理内容:静态资源访问
2.处理内容:模版引擎
3.处理内容:请求参数不同时,固定响应的动态数据(例如广告)
(四)响应
创建网站服务器
//1.下载express框架
npm install express
//2.引入express框架
const express = require("express")
//3.创建网站服务器,监听端口
const app = express(); //app就是网站服务器
app.listen(3000);
(二)请求
1.路由:路由就是中间件,相同的请求地址可以按顺序依次执行两个路由
//接收get类型路由
app.get("路由地址", (req, res) => {
res.send() //定义在xmind
})
//接收post类型路由
app.post("路由地址", (req, res) => {
res.send() //定义在xmind
})
//接收post+get类型路由
app.use("路由地址", (req, res) => {
res.send()
next();
})
//use中间件的第二种书写方式
app.use(fn())
function fn() {
return function (req, res, next) {
//判断条件
next()
}
}
2.模块化路由:路由抽出到单独js写
在总JS文件中引入
//1.创建服务器
const app = express()
//2.在下方地址引入home路由
const home = require("下方地址")
//3.当地址为"/"时,去下方地址找home路由;
app.use("/", home)
在子JS文件中写:每一个路由js文件都得写一遍
//1.引入express框架
const express = require("express")
//2.根据express服务器,创建路由对象
const home = express.Router()
//3.当地址栏为"/"+"baidu"时,写req和res;
home.get("baidu", (req, res) => {
res.end()
})
module.exports = home;
3.中间件:就是路由的拆开写方式,相同的请求地址,在不同路由中依次执行
app.get("路由地址", (req, res, next) => { //添加next后,就可以走下个中间件中处理
res.send() //定义在xmind
next(); //执行完成后向下匹配中间件
})
4.中间件的案例:请求地址前必须先登陆
app.use("路由地址", (req, res, next) => { //添加next后,就可以走下个中间件中处理
代码待定
if (true) {
next();
} else if (false) {
console.log("")
}
})
app.get("路由地址", (req, res, next) => { //添加next后,就可以走下个中间件中处理
res.send("成功登陆且请求成功")
next();
})
5.1中间件的案例:错误处理中间件,同步代码错误,不需要在正常的路由填写next参数
//1.同步代码错误,不需要在正常的路由填写next参数
app.use("地址", (req, res) => {
throw new Error("程序错误")// 就是程序中的错误
})
app.use((err, req, res, next) => { //不写路由地址就是给每个错误进行处理
res.status(500).send(err.message) //将程序错误输出
}
5.2中间件的案例:错误处理中间件,异步代码错误,需要在正常的路由填写next参数,并且把错误err传递给参数
//2.异步代码错误,需要在正常的路由填写next参数,并且把错误err传递给参数
app.use("地址", (req, res, next) => {
fs.readFile("地址", "utf8", (err, result) => {
next(err)
})
})
app.use((err, req, res, next) => { //不写路由地址就是给每个错误进行处理
res.status(500).send(err.message) //将程序错误输出
}
5.3中间件的案例:错误处理中间件,异步函数转化为同步代码时,获取异步代码错误
//3.异步函数转化为同步代码时,获取异步代码错误
app.use("地址", async (req, res, next) => {
try {
await fs.readFile("地址", "utf8") //可能发生代码错误的代码
}.catch (ex) {
next(ex)//ex为错误信息,next将错误信息传递出去,触发错误处理中间件
}
})
app.use((ex, req, res, next) => { //不写路由地址就是给每个错误进行处理
res.status(500).send(ex.message) //将程序错误输出
}
6.请求:请求参数
获取get请求参数
app.get("/", (req, res) => {
req.query //请求地址的参数,json格式的对象
})
——————————//路由参数
//1.浏览器输入参数
localhost: 3000 / index / 123 / 123 / 123
//2.获取参数
app.get("/index/:id/:name/:age", (req, res) => {
req.params //请求地址中的参数 【{"id":"123"},{"name":"123"},{"age":"123"}】
})
获取post请求参数
//1.引入body-parser模块
const bodyParser = require("body-parser")
//2.利用use中间件拦截所有请求,第一个参数地址为空,第二个参数:内部代码(将参数通过body,next到下方路由)
app.use(bodyParser.urlencoded({ extend: false }))
//3.添加中间件后,调用req.body就是参数了
app.post("/", (req, res) => {
req.body //请求地址的参数,json格式的对象
})
(三)处理内容
1.处理内容:静态资源访问
app.use("/static", express.static("静态资源目录绝对路径")) //通过静态资源目录的实际位置,在浏览器地址栏可以直接访问
2.处理内容:模版引擎
//1.下载模版引擎第三方模块
npm install art - template
npm install express - art - template
//2.使用后缀名为art的express - art - template模版引擎
app.engine("art", require("express - art - template"))
//3.关联模版存放的位置:参数1固定,参数2,模版存放的位置,
app.set("views", path.join(__dirname, "模版存放的文件夹"))
//4.如果路由没写后缀,默认模版后缀
app.set("views engine", "art")
//5.路由关联
app.get("/", (req, res) => {
res.render("模版名字.art", { //1.render:帮助拼接模版路径,2.拼接模版后缀,3.将模版数据拼接,4.响应客户端
"属性1": 1,
"属性2": 2
})
})
3.处理内容:请求参数不同时,固定响应的动态数据(例如广告)
//1.将公共数据添加到locals下
app.locals.lzy = [{}, {}, {}] //lzy和值都是自定义的,什么都行
//2.在模版中:可以直接匹配输出lzy的值,不需要render往里面加数据
(四)响应
//自动编写状态码
//自动检测响应内容类型
//自动写utf-8
res.send() //定义在xmind
//设定状态码,例如res.status(404)
res.status(500)