对于想要往更好的方向发展的前端开发来说,对于后端的了解程度和水平往往决定了你的薪资程度和在公司的话语权。node.js是一门对于前端工程师来说最好入门和理解后端的技术,值得我们每一个人好好学习。
中间件的概念
首先中间件并不是nodejs特有的概念,它是指在应用与应用之间充当连接服务的,简单的来说,就是我们在接收到请求到把响应发出去之间我们进行的操作,把这些操作抽象化成一个一个的module,这个就是中间件,接下来,我已express框架为例说明一下。
express中的中间件
在我们安装完nodejs和express之后,在命令行运行
express myapp
然后就会在本地生成一个app的文件夹,里面那就是express的骨架或者说脚手架,目录结构如下
├── app.js
├── bin
│ └── www
├── package.json
├── public
│ ├── images
│ ├── javascripts
│ └── stylesheets
│ └── style.css
├── routes
│ ├── index.js
│ └── users.js
└── views
├── error.pug
├── index.pug
└── layout.pug
在app.js中,我们看最上面的代码:
var createError = require('http-errors'); // 创建错误对象
var express = require('express'); // 处理器
var path = require('path'); // 处理路径相关
var cookieParser = require('cookie-parser'); // cookie解析
var logger = require('morgan'); // 日志
这些就是express已经帮我们定义好的中间件,具体用法官方文档有很详细的说明,强烈建议大家有时间研究一下。
自定义中间件
在这里我自定义一个中间件,展示一下中间件的写法和用法
我们在新创建好的express脚手架中,创建一个middleware文件夹,然后再在里面创建一个index.js
E:\express\myapp> mkdir middleware
E:\express\myapp> cd middleware
E:\express\myapp\middleware> mkdir index.js
然后我们在index.js中定义一个变量
module.exports.initLocals = function (req, res, next) {
// 将数据存放至res.locals中
res.locals.courses = [
{
user: 'root',
password: ''
},
{
user: 'admin',
password: 'admin'
},
];
next();// 进入后续中间件
}
这时候我们已经编写好一个简单的中间件,这时候我们需要去app.js中进行引用
var createError = require('http-errors'); // 创建错误对象
var express = require('express'); // 处理器
var path = require('path'); // 处理路径相关
var cookieParser = require('cookie-parser'); // cookie解析
var logger = require('morgan'); // 日志
const {initlocals} = require('./middleware'); // 自定义组件
单单定义是不行 我们还需要在下面引用
var app = express();
// 中间件的操作 谁在前谁先执行
app.use(logger('dev')); // 日志
app.use(express.json()); // 获取ajax传递的json转码
app.use(express.urlencoded({ extended: false })); // 解析url参数
app.use(cookieParser()); // 获取 解析cookie
// 设置静态路径
app.use(express.static(path.join(__dirname, 'public')));
// 设置中间件
app.use(initlocals); // 执行自定义的中间件
这时候我们就已经定义好了这个中间件,相当于在全局生成了一个courses对象,可以在任何地方已 res.locals.courses的方式引用。
在我们以后定义一些全局的方法,npm上已有的插件,或者对数据库进行增删改查的时候,都需要引用中间件进行处理,这就是我对于中间件使用的一些简单的理解,欢迎大家讨论。