一 、 express
(1) 使用 express 搭建静态服务器
静态服务器
后端语言 + 后端渲染模板 生成前端的 html 结构,然后在发送到前台,这种做法就叫做后端渲染。
const express = require( 'express' )
//得到app对象, 目的是为了绑定中间件
const app = express()
const PORT = 8000
const HOST = 'localhost'
const fs = require( 'fs' ) // 文件系统
// 要想将模板中的内容发送出去,我们可以通过app对象和路由中间件来做
app.get('/home',( request,response,next ) => {
// fs.readFile( 路径,字符编码, 回调函数)
fs.readFile( './static/html/index.html', 'utf8', ( error,docs ) => {
if( error ){
console.log( error )
}else{
response.send( docs )
}
})
})
// 监听服务器
app.listen( PORT,HOST,() => {
console.log( `服务器运行在: http://${ HOST }:${ PORT }` )
})
(2) 使用 express 打造 api 服务器
在api服务器中,一个路由就是一个api,也就是一个后端接口 。
const express = require('express')
const app = express() //得到app对象
const PORT = 5000
const HOST = 'localhost'
// 引入user路由模块
const userRouter = require('./route/user.js')
app.use('', userRouter) //通过app对象使用路由模块
app.listen(PORT, HOST, () => {
console.log(`api服务器`)
})
(3) 打造接口
格式: router.get ( 路由路径, 回调函数 )
增: post
删: delete
改: put
查: get
以上 api 中接收一个回调函数作为参数
put 和 delete 会自动携带请求 options 请求
上面这种规则就是 restful api
使用 restful api 规则来暴露接口
const express = require('express')
//创建模块
const router = express.Router() //得到路由对象
router
.route('/user')
.post((req, res, next) => {
res.json({
ret: true,
status: '添加成功'
})
})
.delete((req, res, next) => {
res.json({
ret: true,
status: '删除成功'
})
})
.put((req, res, next) => {
res.json({
ret: true,
status: '修改成功'
})
})
.get((req, res, next) => {
res.json({
ret: true,
status: '查询成功'
})
})
// 模块的导出
module.exports = router
二 、express-generator
在Node.js中我们可以使用一个快速生成工具,帮助我们快速构建一个后端项目, 这个工具叫做 express-generator 生成器 【 脚手架 】
如何使用?
1. 安装 【 两种方式 】
(1) 全局安装
$ cnpm i express-generator -g
express -e 项目名称
(2) 不使用全局安装
使用npx生成,但是要求npx对应的npm版本在 5.2 以上,npm5.2版本以上自动携带npx
- 第二种方式使用
$ npx express -e 项目名称
-e 表示使用ejs模板, -e 是可以换的
2. 项目目录结构
(1) bin: www 创建服务器,并监听服务器
(2) public : 静态资源目录 : img、 css
(3) routes: 路由文件
(4) view: 模板文件 ejs / pug
(5)app.js 整个项目的入口文件: 中间件类型 【 3种 】
a. 应用级中间件( 只是一个单一功能, 如:绑定静态资源目录)
// 绑定应用级中间件
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false })); // 省略文件后缀名
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
b. 路由中间件 ( 暴露一个路由 )
// 绑定路由中间件
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/shopcar', shopcarRouter);
c. 错误处理中间件 ( 处理项目的错误 )
// 错误处理中间件 开始
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
// 错误处理中间件结束