基本介绍
它是web开发框架:
-
web开发
它运行在node.js之上,用来提供web服务 显示窗口 提供接口服务
-
框架
是半成品,用来快速解决某一类问题, 要遵守框架的使用规范
第一个express的程序
创建项目并初始化
-
创建nodejs项目
npm init -y // 初始化项目
-
下载express包
npm install express //本地安装 express 到项目中
-
使用express快速创建web服务器
// 0. 加载 Express const express = require('express') // 1. 调用 express() 得到一个 app // 类似于 http.createServer() const app = express() // 2. 设置请求对应的处理函数 // 当客户端以 GET 方法请求 / 的时候就会调用第二个参数:请求处理函数 app.get('/', (req, res) => { res.send('hello world') }) // 3. 监听端口号,启动 Web 服务 app.listen(3000, () => console.log('app listening on port 3000!'))
express静态资源托管
在某个文件夹下的内容可以直接被访问
app.use(express.static('目录名')) //忽略前缀
app.use('/xxxx', express.static('目录名')) //带访问前缀
// 这意味着想要访问xxxx下的内容,必须要在请求url中加上/xxxx
路由和接口
路由
这个概念是从后端发源的,后边慢慢也延伸到前端了,它就是一个约定: 当用户访问xx地址时,执行xxxx逻辑
-
格式
const app = express(); // 定义路由 app.METHOD(PATH, HANDLER)
-
示例
server.get('/getInfo', (req, res) => { res.json(xxxxx) } ) // 当用户以get类型请求/getInfo时,执行后面的回调: 以json字符串格式返回数据
在后端叫路由 在前端叫接口
express-get请求-带参数
express框架会自动收集get方式从url地址中传递的查询字符串参数,并自动保存在req对象的query
属性中。我们直接来获取即可。
const express = require('express');
const app = express();
app.get('/get', function(req, res) {
// 直接返回对象
console.log(req.query);
res.send({ name: 'abc' });
});
app.listen('8088', () => {
console.log('8088');
});
express-post请求-带参数-普通键值对
post参数是在请求体中的,它有参数有三种情况
1.普通键值对
2.json对象
3.文件上传
如何获取普通键值对参数?
// 1. 使用中间件
app.use(express.urlencoded()); // 请求体 中的携带的 普通键值对 解析出来,保存在req.body中
app.post("/add",function(req,res){
//2. 可以通过req.body来获取post传递的键值对
res.json(req.body)
})
express-post请求-带参数-复杂json格式数据
如何获取复杂json格式数据参数?
app.use(express.json());
// 会自动加入req.body属性,这个属性中就包含了post请求所传入的参数
// 用来处理JSON格式的数据
app.post('/postJSON',(req,res)=>{
// 后端收到post传参
console.log(req.body);
res.send('/postJSON')
})
express-post请求-带参数-formData涉及文件上传
如何获取formData格式数据参数?
如果post涉及文件上传操作,则需要在服务器端额外使用第三方multer
这个包(不属于express)来获取上传的信息。
-
下载包:multer
npm install multer
-
配置
const upload = multer({dest:'uploads/'}) // 上传的文件会保存在这个目录下 // uploads表示一个目录名,你也可以设置成其它的
-
使用
// 这个路由使用第二个参数 .upload.single表示单文件上传, // 'cover' 表示要上传的文件在本次上次数据中的键名。对应于前端页面上的: // <input type="file" name='cover'/> app.post("/postfile",upload.single('cover'), function(req,res){ // req.file 记录了文件上传的信息 // req.body 记录了其它普通参数(非文件)的信息 // 其它操作 })
理解接口传参
我们一般使用ajax技术向接口传参,按http协议的约定,每个请求都有三个部分:
请求行: 保存了请求方式,地址,可以以查询字符串的格式附加一部分数据。
请求头:它可以附加很多信息,其中content-type用来约定请求体中保存的数据格式。
请求体: 本次请求携带的参数。至于这些参数到了后端应该如何解析出来,由请求头中的content-type来决定
有两个地方可以用来传参数
- 请求行
- 请求体
四种处理方式:
require的加载机制
在我们使用一个模块时,我们会使用require命令来加载这个模块。以加载一个自定义模块为例,require(文件名)的效果是:
- 执行这个文件中的代码
- 把这个文件中的module.exports对象中的内容返回出来。
require有缓存
require
优先加载缓存中的模块。同一个模块第一次require之后,就会缓存一份,下一次require时就直接从缓存中去取
同一个模块,多次require,只执行一次 - require的格式
require(模块名)
核心模块
第三方模块
require(相对路径)
自定义模块
require加载规则:
如果不写后缀名
先找xxxx.js ,再找xxxx.json, 再找xxxx.node
在本项目中的node_modules中找, 找不到,去上一级, 直到根目录为止