next()调用nodejs中的express-ws模块
我遇到了一个示例代码为我的networking服务器使用express-ws在我的服务器和客户端浏览器之间进行可靠的Websocket连接。 代码将开始在3000端口监听websocket连接。
var express = require('express'); var app = express(); var expressWs = require('express-ws')(app); app.use(function (req, res, next) { console.log('middleware'); req.testing = 'testing'; return next(); }); app.get('/', function(req, res, next){ console.log('get route', req.testing); res.end(); }); app.ws('/', function(ws, req) { ws.on('message', function(msg) { console.log(msg); }); console.log('socket', req.testing); }); server.listen(3000);
next-API在express-websocket中有什么用处?
它调用堆栈中的下一个middleware
。
中间件function是可以访问请求对象(req),响应对象(res)和应用程序请求 – 响应周期中的下一个中间件function的函数。 下一个中间件函数通常用名为next的variables表示。中间件函数可以执行以下任务:
- 执行任何代码。
- 更改请求和响应对象。
- 结束请求 – 响应循环。
- 调用堆栈中的下一个中间件。
如果当前的中间件function没有结束请求 – 响应周期,则必须调用next()将控制传递给下一个中间件function。 否则,请求将被挂起。 示例一个使用express的简单hello world
示例,稍后我们将定义中间件函数。
var express = require('express'); var app = express(); app.get('/', function (req, res) { res.send('Hello World!'); }); app.listen(3000);
中间件function
var myLogger = function (req, res, next) { console.log('LOGGED'); next(); }
注意上面的调用next()
。 调用这个函数调用应用程序中的下一个中间件function。 next()
函数不是Node.js
或Express API
,而是传递给中间件函数的第三个参数。 next()
函数可以被命名为任何东西,但是按照惯例,它总是被命名为“next”
。 为避免混淆,请始终使用此约定。
要加载中间件function,请调用app.use(),指定中间件function。 例如,以下代码在到根path(/)的路由之前加载myLogger中间件function。
var express = require('express'); var app = express(); var myLogger = function (req, res, next) { console.log('LOGGED'); next(); } app.use(myLogger); app.get('/', function (req, res) { res.send('Hello World!'); }); app.listen(3000);
每次应用程序收到一个请求时,它会向terminal输出“LOGGED”消息。
中间件加载顺序非常重要:首先加载的中间件function也首先执行。
如果myLogger在到根path的path之后加载,请求永远不会到达它,并且应用程序不会打印“LOGGED”,因为根path的路由处理程序会终止请求 – 响应循环。
中间件函数myLogger只是打印一条消息,然后通过调用next()
函数将请求传递给堆栈中的下一个中间件函数。
源代码Expressjs指南文章
如果您想了解如何编写用于快速应用的中间件,请按照本指南进行操作
编写用于快速应用程序的中间件