1.express简介
express项目生成器,是一个nodejs程序,可以快速搭建一个express项目。
安装指令是 npm install express-generator -g 全局安装,
使用命令:express [项目名] -v
项目根目录下有4个自带的文件夹
bin:存放项目源代码的文件夹。
public:项目静态文件夹。
routers:存放路由的文件夹。
views:存放模板的文件夹。
注意:创建的项目中没有node_modules文件夹,但是在package.json中写好了依赖项,所以创建完项目之后需要先npm install 安装依赖项。
运行项目的命令是 npm start
1. 执行node ./bin/www这个文件,这个文件创建/启动服务器,除此之外又记录了服务器运行日志,以及服务器在运行过程监听错误,监听其他信息等。
但注意在创建服务器时,使用了app.js入口文件。
2. app.js做了什么工作?
app.js引入各种模块包,其中最重要是express框架,使用框架包创建应用程序实例,在应用程序运行过程中,需要其他模块包配合它。比如:http-error记录请求过程中的错误信息。再比如morgan记录请求日志,
再比如cookie-parser记录cookie解析。还是express.json(),express.urlencoded()。相对比较重要的路由中间件(必须掌握如何定义路由)。
2.app.js介绍
// http-errors 这个模块包主要是监听在请求的过程中出现的错误和错误信息,是一个中间件本质也是一个模块,其实是一个函数
var createError = require('http-errors');
// 语句->函数->脚本库->模块->框架->平台
// 引入express模块
var express = require('express');
// 引入path模块,路径
var path = require('path');
// 主要对cookie进行设置或者获取的功能
var cookieParser = require('cookie-parser');
// 主要是负责服务器日志
var logger = require('morgan');
// 引入的路由文件
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
// 创建服务器对象
var app = express();
// 设置服务器对象的中间件
// view engine setup
// 模板渲染的页面所存放的位置
app.set('views', path.join(__dirname, 'views'));
// 使用的渲染语法
app.set('view engine', 'ejs');
app.use(logger('dev'));
// 使用json解析对象或者字符串
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// 使用两个路由文件
app.use('/', indexRouter);
// 可以为一个路由文件的接口添加前缀,把路由前缀加上/users/
app.use('/users', usersRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
// next把本次请求传递给另一个中间件,如果没有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');
});
module.exports = app;
3.关于路由和中间件
路由:URL到函数的映射。Route是一条路由:就是把路径与函数进行一一对应,通过路径信息调用特定的函数,Routers则负责管理route与函数之间的映射关系。路由分为静态路由和动态路由,静态内容的路由都是固定的。动态的内容则不是,我们可以通过传递参数而获取某个用户的信息,而不是单独设置一条静态路由。
通过express创建一个路由
var router = express.Router();
通配符: :id相当于任何的参数,但是不能为空
router.get('/delete/:id', function(req, res, next) {
console.log(req.params.id);
res.send('respond3 with a resource');
});
中间件:所谓中间件其实也是一个路由,是一个可以处理所有http请求的路由.
1.路由处理器第一个参数必须是路径,如果要让一个路由匹配所有的路径,可以用 /* .
中间件也可以用路径作为第一个参数,而它是可选的,如果忽略了这个参数,它就会匹配所有的路径。
2.路由处理器和中间件参数都有回调,回调有2个参数时,是(req,res);回调有3个参数时,是(req,res,next);有4个参数时,是(err,req,res,next);
3.next。如果在中间件回调中调用了next(); 程序就会继续匹配下一个合适的路由处理器,如果你没有在中间件调用next()的话,中间件在处理完之后就会被终止,不会继续匹配相应的路由处理器,这时应该要发送响应到客户端,否则客户端会被挂起最终超时。
4.如果在中间件回调中调用了next();就不宜发送响应到客户端了,因为你发送了响应,之后的中间件或者路由器还会继续匹配执行,但是它们发送的任何响应都会被忽略。
中间件:在请求和响应之间封装一层处理请求的模块,本质是一个函数,可以对请求进行处理和加工,然后交给具体的接口,如果找不到对应的接口,就会报错.一般会在中间添加next函数,保证中间件不会拦截掉请求.