1.http模块
1.1创建一个最基本的web服务器
//1.引入http模块
const http=require('http')
//2.创建http服务器
const httpServer=http.createServer();
//3.绑定request事件
httpServer.on('request',(req,res)=>{
//处理业务;逻辑
res.end('hello world')
})
//4.开启服务器
httpServer.listen('3000','127.0.0.1',()=>{
console.log("开启服务器!请访问:http://127.0.0.1:3000")
})
解决中文乱码问题,在响应之前添加响应头信息:
res.writeHeader(200,{
"Content-Type":"text/pain;charset=utf-8"
})
获取客户端请求的URL:
req.url
拓展内容:
MIME类型,在网络传输中起到标识的作用,根据后缀名来划分的类型
text/palin 纯文本 .txt
text/html HTML数据 .html
image/jpeg jpg图片
1.2nodemon工具的介绍
因为每次修改服务器代码都要重新运行服务器才可以让最新的代码生效,
所以产生了nodemon,该工具的作用非常简单,当服务器代码发生改变时会自动重启服务器
安装:
npm install nodemon -g
2.express基本用法
1.安装express包
npm install express
2.代码中引入express包
const express require('express')
3.调用express函数创建服务器
const app=express()
4.监听用户的请求
app.get('/',(req,res)=>{
//原生http模块的方法返回数据
res.end()
//express封装的方法,也可以向客户端返回数据并且解决了乱码问题
res.send()
})
5.开启服务器
app.listen(3000,()=>{
console.log(‘服务器启动成功,请访问:http://127.0.0.1:3000’)
})
2.1 express框架的特点
-
基于node.js平台之上,进一步封装了http模块.从而提供了更好用,更友好的API
-
使用express创建网站,比使用原生的http模块更加方便;
-
express并没有覆盖原生http模块的方法之上,做了更友好的封装,让用户体验更好
2.2 express中的快捷方法
2.2.1.res.send() -
支持发送字符串 Content-type:text/html
-
支持发送对象或数组 content-type:application/json
-
支持发送buffer此时会当做文件下载
2.2.2.res.sendFile()
- [ ] 用法1:res.sendFile(path.join(__dirname , './view/index.html'))
参数1:路径,如果只传入一个参数,该路径必须是绝对路径
- [ ] 用法2 res.sendFile('./view/movie.html',{root:__dirname})
参数2:如果第一个参数传入的是相对路径,第二个参数必须指定相对路径相对于那个绝对路径,root
2.2.3使用express.static()快速托管静态资源
2.2.3.1语法1:
app.use(express.static(‘public’));
app.use()方法,是专门用来注册中间件;
express.static是express的内置中间件
2.2.3.2语法2:
app.use(’/虚拟目录’,express.static(‘public’))
3 ejs简介
ejs是服务器比较常用的一个模板引擎,和artTempalate类似
使用ejs的步骤:
3.1在项目中安装ejs
npm install ejs
3.2在express中配置模板引擎
app.set('view engine','ejs')
3.3配置模板页面所在的路径
app.set('views','./ejs_pages')
3.4.当用户请求数据时,做出相应之前可以进行模板引擎的渲染
res.render('index.ejs',{})
4.封装express的路由模块
路由:前端向后台请求某个资源,后台收到请求后将做出对应的处理
例如:
前端的url发送请求:/getUsers
后台根据/getUsers接口地址作出对应的响应就被称之为路由
主程序代码:
const express =require('express')
const app =express()
//1.导入路由对象
const router =require('./09.router.js')
//2.调用app.use方法,安装路由模块
app.use(router)
app.listen(3000,()=>{
console.log('server running at http://127.0.0.1:3000')
})
4.1路由模块
- 引入express框架
const express=require('express')
2.创建路由对象
const router express.Router()
3.挂载路由规则
router.get( '/movie,(req,res)=>{
res.sendFile("./views/movie.html",{
root:__dirname
})
}')
4.导出路由对象供外界使用
module.express=router
5.中间件
定义;中间件就是一个处理函数,只不过这个函数比较特殊,包含三个参数分别是
req,res,next
注意:中间件方法中的三个参数:
req:请求对象
res:响应对象
next:next()可以被调用,表示调用下一个中间件的方法
5.1express框架中对中间件的5种分类
- 应用级别的中间件: 挂载到 app 上的中间件 app.get(‘URL地址’, (req, res, next)=> {});
- 路由级别的中间件: 挂载到 router 对象上的中间件 router.get(‘url地址’, (req, res, next)=>{})
- 错误级别的中间件: 回调函数中,有四个参数 app.use((err, req, res, next)=>{})
- 唯一内置的中间件: express.static()
- 第三方中间件: 非express框架提供的,需要程序员手动安装才能使用的中间件;body-parser 解析post 表单数据
中间件的概念,了解即可,因为实际开发中,我们都直接使用第三方现成的中间件;
5.2自定义post请求参数解析的中间件
//导入express模块
const express=require('express')
const querystring=require('querystring')
//创建一个express的服务器实例
const app =express()
//定义 应用级别的中间件 只要客户端请求服务器就会触发回调函数的执行
app.use((req,res,next)=>{
let dataStr=''
//只要客户端向服务器提交了表单,都会触发req 的data事件
//在data事件中,可以获取到客户端每次提交过来的,不完整的数据
req.on('data',chunk=>{
dataStr+=chunk
})
//只要req触发了end事件,就表示表单数据提交完毕了,dataStr中储存的数据,就是完整的表单数据
req.on('end',()=>{
console.log(dataStr)
const obj=querystring.parse(dataStr)
//想要把 username =ls&password=123字符串,解析为{username:'ls',password:123}
console.log(obj)
req.body=obj
//进入下一个中间件的处理环节
//注意:在中间件中,最后一定要合理调用下一个next()方法,否则无法结束本次响应
next()
})
})
// 这是应用级别的中间件
app.get('/', (req, res) => {
res.sendFile('./11.index.html', { root: __dirname })
})
app.post('/postdata', (req, res) => {
console.log(req.body)
// 需求:如何从客户端提交的表单中,获取到 客户端提交过来的数据呢?
res.send(req.body)
})
// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(3001, function() {
console.log('Express server running at http://127.0.0.1:3001')
})