1. 为什么使用express?
由于NodeJs本身的异步非阻塞特性和对http的天然支持,所以使用NodeJs编写高性能,可伸缩的Web服务器非常简单。但是开发完整的Web服务器还需要路由,错误处理,请求拦截,请求和响应的解析,模板引擎等功能,所以直接使用NodeJs的http模块开发起来还是挺痛苦的。
目前有很多的Web框架都是基于http模块封装而成,最流行的当属Express框架。
express类似于(thymeleaf )支持很多的模板引擎,每个模板引擎都有自己的语法。
Html页面本身是静态的,不含动态数据的。模板引擎的作用就是将从数据库读出来的,处理好的数据填充到html页面,然后返回给用户。
学习资源:
快速开始
npm install express --save
快速开启服务器:
const express = require('express');
const app = express();
app.get('/', function(req, res){
res.send('hello world');
});
app.listen(3000);
静态文件
..静态文件的添加,不用重启服务器
express提供了托管静态文件的功能,比如html,图片,CSS,JavaScript等文件。
app.use(express.static('public')); // static是方法
..上面的'public'是文件夹的名称,写成还是static的,那就找不到了!
支持指定挂载路径:
app.use('/static', express.static('public'));
一般框架提供的静态文件托管功能,只是在开发环境使用。在生产环境,推荐交给反向代理服务器来管理,比如Nginx;最佳的做法是花点钱交给CDN(像阿里云)提供商来服务。
2. 什么是路由?
路由就是根据用户请求的url路径,交由对应的响应方法处理。
请求方法
app.get('/', function (req, res) {
res.send('GET request to the homepage');
});
// POST method route
app.post('/', function (req, res) {
res.send('POST request to the homepage');
});
什么是模块化路由?
模块化路由是指我们可以将一组具有业务相关性的路由封装为一个router对象,然后挂载到指定路径。
3. 什么是中间件?
中间件就是整个请求——>响应流程中的一系列处理函数。路由也是属于中间件,是挂载了路径的中间件。
使用中间件有两点注意:
-
next() 方法和 res.send() 必须调用一个,否则请求就会挂起,客户端等待响应。
-
中间件的顺序很重要,它是按照你注册的顺序执行的。
4. 什么是错误处理?
程序总会遇到错误,比如:传参错误,我们不小心调用了undifined
,或者我们自己也可能抛出异常。当发生这些错误的时候我们需要给用户一个友好的回应,这就是错误处理。
定义错误处理中间件和定义其他中间件一样,除了需要 4 个参数,而不是 3 个,其格式如下 (err, req, res, next)
。例如:
app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500).send('出错了!');
});
错误中间件返回的响应是随意的,可以响应一个 HTML 错误页面、一句简单的话、一个 JSON 字符串,或者其他任何您想要的东西。
在其他 app.use()
和路由调用后,最后定义错误处理中间件,比如:
app.use(bodyParser());
app.use(router);
app.use(function(err, req, res, next) {
// ...
});
5. WebApp进程管理PM2
在生产环境我们不会使用node app.js
的方式来开启程序,因为我们有这样的一些需求:
-
如果进程崩溃了,需要重启
-
监控当前进程的CPU使用率和内存占用
-
搭建集群
进程管理器就能提供上面的功能,让我们的NodeJs进程永不退出。最流行的进程管理器有3个:
其中PM2除了提供上面的功能外,还可以监视程序的日志,错误提醒,并且内置了负载均衡器,界面还友好。所以我们选择使用PM2。
学习资源
第三方中间件:http://www.expressjs.com.cn/resources/middleware.html
API查询:http://www.expressjs.com.cn/4x/api.html
6. 异步异常的捕获
require(`express-async-errors` )
https://www.npmjs.com/package/express-async-errors
也就是直接使用npm里的这个异常捕获即可