Express
原生的http在某些方面不足以应对我们的开发需求,所以我们需要使用框架来加快开发效率让我们的开发高度统一
安装
npm install --save express
express开启node服务
const express = require('express'); //引入express函数
const app = express(); //调用express函数得到返回值app
app.get('/', (req, res) => {
res.send('index');
}) //发起get请求
app.listen(3000, () => {
console.log('服务已开启,请通过3000端口访问...');
}) //监听node服务
1. 基本路由
get
//当你以GET方法请求的时候,执行对应的处理函数
app.get('/',function(req,res){
res.send('hello world')
})
post
//当你以POST方法请求的时候,指定对应函数
app.post('/',function(req,res){
res.send('Got a POST request')
})
开放静态资源,public目录
app.use('url路径开头',express.static('资源目录'))
//当以/public/开头的时候,去./public/寻找资源
app.use('/public/', express.static('./public/'));
//表示,只有当以/a/开头的时候,才可以访问./public/内部的文件
app.use('/a/', express.static('./public/'));
//当省略第一个参数的时候,可以通过省略/public/的方式来访问
app.use(express.static('./public/'));
www.expressjs.com.cn/starter/sta…
2. path文件操作模块
const path = require('path') //引入
注意不要使用 ‘\’ 作为连接符,否则会将后面一个字符转译
path.basename
- 获取一个路径的文件名(默认包含扩展名)
console.log(path.basename('C:/Users/27843/Desktop/node.js学习'))
// node.js学习
path.dirname
- 获取一个路径的目录部分
console.log(path.dirname('C:/Users/27843/Desktop/node.js学习'))
// C:/Users/27843/Desktop
path.extname
- 获取一个路径中的扩展名部分
console.log(path.extname('C:/Users/27843/Desktop/node.js学习'))
.js学习
path.parse
- 把一个路径转换为对象
- root 根路径
- dir 目录
- base 文件名 包含后缀
- ext 后缀名
- name 不包含后缀名的文件名
console.log(path.parse('C:/Users/27843/Desktop/node.js学习'))
// 运行结果
{
root: 'C:/',
dir: 'C:/Users/27843/Desktop',
base: 'node.js学习',
ext: '.js学习',
name: 'node'
}
-
path.join
- 拼接路径
console.log(path.join('C:/Users/27843/Desktop', '/node.js学习')) // C:\Users\27843\Desktop\node.js学习 -
path.isAbsolute
- 判断一个路径是否是绝对路径
console.log(path.isAbsolute('C:/Users/27843/Desktop/node.js学习')) // true
3. node绝对路径
在每个模块中,处理require,exports等模块相关API之外,还有两个特殊成员
__dirname动态获取可以用来获取当前文件模块所属目录的绝对路径__filename动态获取可以用来获取当前文件的绝对路径
在node中,使用相对命令是不可靠的,因为我们的相对路径是相对于命令行的执行位置的
所以为了解决这个问题,只需要把相对路径变成绝对路径
这里我们可以使用__dirname或者filename来解决问题
为了避免手动拼接字符串带来的低级错误,我们推荐使用path.join来辅助拼接
path.join(__dirname, './node_modules')
以后在文件操作中,我们使用的相对路径尽量都转换成绝对路径
补充:模块中的路径标识和这里的路径没关系,不需要改变使用方式在Express获取表单GET请求体数据
4. express带参get请求
不需要使用url模块,直接req.query即可
app.get('/pinglun', function(req, res) {
var comment = req.query;
comment.dateTime = '2020年10月26日 12:26:51';
comments.unshift(comment);
//express重定向 给res添加redirect方法
res.redirect('/');
})
//使用req.query传递我们需要的数据
router.get('/profile/:id', passport.authenticate('jwt', { session: false }), (req, res) => {
console.log(req.params.id)
})
//url: http://localhost:3000/profile/2
// log: 2
express重定向,res.redirect('/')
5. 获取表单POST请求体数据
在Express中没有内置获取表单POST请求体的API,这里我们需要使用一个第三方包 body-parser,
安装
npm install --save body-parser
配置
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
//配置body-paeser
//只要加入这个配置,则在req请求对象上会多出来一个属性:body
//也就是说,可以直接通过req.body来获取表单post
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
app.use(function (req, res) {
res.setHeader('Content-Type', 'text/plain')
res.write('you posted:\n')
//通过req.body来获取表单POST请求体数据
res.end(JSON.stringify(req.body, null, 2))
})
6. express实现后端路由
路由文件router.js
var express = require('express');
//创建一个路由容器
var router = express.Router();
//将app改为router
router.get('/students/new', function(req, res) {
fs.readFile('./views/new.html', function(error, data) {
if (error) {
return res.send('500 服务器错误')
}
res.end(data)
})
})
router.post('/students/new', function(req, res) {
})
//导出router
module.exports = router;
app中引入路由文件和使用路由文件
//引入router模块
var router = require('./router');
//把router挂载到app服务中
app.use(router);