1.综述
中间函数(中间件),技术上说就是得到一个请求对象,要么反馈客户端,要么传递给另一个中间函数。在Express中,所有路由句柄函数都是中间函数。
app.use(express.json());
当我们调用express.json()
方法时,它返回一个函数对象,它是一个中间函数。这个函数的作用就是读取请求,如果请求体是一个JSON格式对象,它就会格式化这个JSON对象,并以此设置req.body
属性。
当服务器收到一个请求,请求就进入一个管道,我们将这个管道成为请求处理管道,管道之中有一个或多个中间函数,每个函数要么根据请求向客户端返回数据,要么将控制权交给其他中间函数。
Express总体来说就是一堆的中间函数。
2.创建自定义中间件
中间件按顺序调用。
我们可以对代码结构进行优化:
将中间函数放入另一个文件中
3.第三方中间件
以Helmet、Morgan的使用为例:
const Express = require("express");
const helmet = require("helmet");
const morgan = require("morgan");
const app = Express();
const Joi = require("joi");
app.use(helmet());
app.use(morgan('tiny'));
4.环境
console.log(`NODE_ENV is:${process.env.NODE_ENV}`);
console.log(`app is:${app.get('env')}`);
NODE_ENV is:undefined
app is:development
可以利用这个,结合morgan中间件,实现只在开发环境中使用日志:
if(app.get('env')=='development'){
console.log("Morgan is running......");
app.use(morgan('tiny'));
}
可以使用下面语句切换为生产环境:
export NODE_ENV = production
5.配置
如何保存应用的配置,并在不同的环境下复用它?
应用配置管理包——config
安装后在应用目录下新建config目录,然后在config目录下新建default.json
文件,development.json文件,以及production.json文件,分别用于默认环境、开发环境和生产环境的应用配置:
default.json:
{
"name":"My express app"
}
development.json:
{
"name":"My express app - development",
"mail":{
"host":"127.0.0.1"
}
}
production.json:
{
"name":"My express app - production",
"mail":{
"host":"127.0.0.1"
}
}
当我们在开发环境下,在index.js中这样调用,出现的是development.json中信息:
console.log("App name:"+config.get('name'));
console.log("mail host:"+config.get('mail.host'));
当我们把process.NODE_ENV更改为production后,再次调用上述语句出现的是production.json里面的信息。
不能利用以上方法保存机密信息,我们一般将机密信息保存在环境变量中,例如:export appname_password = 12345678
,然后通过config模块访问它。
为了实现这一点,在config文件夹下新建custom-environment-variables.json
文件,在这个文件中映射环境变量和应用配置的关系。
{
"mail":{
"password":"app_password"
}
}
console.log("mail password:"+config.get('mail.password'));
mail password:1234
6.Debug
使用debug模块可以避免使用很多的console.log语句,从而避免调试完成后进行大量的删除或注释。我们使用debug语句取代console.log语句:
const startupDebugger = require('debug')('app:startup')//用于调试的专用命名空间
const dbDebugger = require('debug')('app:db')//用于调试的专用命名空间
if(app.get('env')=='development'){
startupDebugger("Morgan is running......");
app.use(morgan('tiny'));
}
//db work
dbDebugger('数据库已连接......');
set DEBUG=app:startup
app:startup Morgan is running...... +0ms
7.模板引擎
有时我们需要返回HTML给客户端,而不是JSON数据,这时就需要使用模板引擎。
以pug为例:
设置图形引擎:
app.set('view engine','pug');
app.set('view','./views');//default
views/index.pug
html
head
title= title
body
h1= message
注意:等号右边一定不能有空格