Nodejs学习笔记(四)Express中间件

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

注意:等号右边一定不能有空格

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值