时间:2023-03-09来源:系统城装机大师作者:佚名
中间件,就是具有串联执行能力的函数,Express中两种层面的中间件。app 层面的中间件, router 层面的中甲件。在 express 中, 一般通过 use 方法和路由的方法添加中间件。
1 2 3 4 5 6 7 8 9 10 11 12 |
exports.init = function (app){ return function expressInit(req, res, next){ if (app.enabled( 'x-powered-by' )) res.setHeader( 'X-Powered-By' , 'Express' ); req.res = res; res.req = req; req.next = next; setPrototypeOf(req, app.request) setPrototypeOf(res, app.response) res.locals = res.locals || Object.create( null ); next(); }; }; |
expressInit 中间件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
module.exports = function query(options) { var opts = merge({}, options) var queryparse = qs.parse; if ( typeof options === 'function' ) { queryparse = options; opts = undefined; } if (opts !== undefined && opts.allowPrototypes === undefined) { // back-compat for qs module opts.allowPrototypes = true ; } return function query(req, res, next){ if (!req.query) { var val = parseUrl(req).query; req.query = queryparse(val, opts); } next(); }; }; |
返回一个 query 函数,在 query 函数中使用 parseUrl 和 queryparse 处理了 url 中 query, 到此就恶意直接在 req 中使用 query 了。
1 | exports.query = require( './middleware/query' ); |
query 中间件被输出了,可以手动调用。
1 2 3 4 5 6 7 8 9 10 |
app.lazyrouter = function lazyrouter() { if (! this ._router) { this ._router = new Router({ caseSensitive: this .enabled( 'case sensitive routing' ), strict: this .enabled( 'strict routing' ) }); this ._router.use(query( this .get( 'query parser fn' ))); this ._router.use(middleware.init( this )); } }; |
在调用 lazyrouter 函数的地方,都会使用 use 函数添加中间件函数。每一个 app 初始化都会注入此两个中间件。
本文介绍了中间件的简单定义,具有串联的特性,以及 Express 中两个内置中间件,一个是 exprss 初始中间件,一个时 express 的 query 中间件。内置 query 中间件被输出可别外部使用,同时在 app.lazyrouter 中被初始化。
2023-03-09
JS实现一个可以当镜子照的 Button2023-03-09
arco design按需导入报错排查思路与解决方案解析2023-03-09
Hardhat进行合约测试环境准备及方法详解有时我们需要依赖于其他状态的状态——在 Vue 中,这是用组件 计算属性 处理的,以直接创建计算值,我们可以使用 computed 方法:它接受 getter 函数并为 getter 返回的值返回一个不可变的响应式 ref 对象。...
2020-11-11