next()在nodejs中的express-ws模块中调用

时间:2016-11-23 06:39:48

标签: node.js express websocket

我使用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);

express-websocket中next()API的用途是什么?

2 个答案:

答案 0 :(得分:1)

它调用堆栈中的下一个middleware

中间件函数是可以访问请求对象(req),响应对象(res)以及应用程序请求 - 响应周期中的下一个中间件函数的函数。下一个中间件函数通常由名为next的变量表示。中间件函数可以执行以下任务:

  • 执行任何代码。
  • 更改请求和响应对象。
  • 结束请求 - 响应周期。
  • 调用堆栈中的下一个中间件。

如果当前的中间件功能没有结束请求 - 响应    循环时,必须调用next()将控制权传递给下一个中间件    功能。否则,请求将被挂起。 explanation 示例使用express的简单hello world示例,稍后我们将定义中间件函数。

var express = require('express');
var app = express();
app.get('/', function (req, res) {
    res.send('Hello World!');
});
app.listen(3000);

中间件功能

var myLogger = function (req, res, next) {
  console.log('LOGGED');
  next();
}

请注意上面的调用next()。调用此函数会调用应用程序中的下一个中间件函数。 next()函数不是Node.jsExpress API的一部分,而是传递给中间件函数的第三个参数。 next()函数可以命名为任何名称,但按照惯例,它总是以“next”命名。为避免混淆,请始终使用此约定。

要加载中间件功能,请调用app.use(),指定中间件功能。例如,以下代码在到根路径(/).

的路由之前加载myLogger中间件函数
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);

每次应用收到请求时,都会向终端显示消息“LOGGED”。

中间件加载的顺序很重要:首先加载的中间件函数也会先执行。

如果myLogger在到达根路径的路径之后加载,则请求永远不会到达,并且应用程序不会打印“LOGGED”,因为根路径的路由处理程序会终止请求 - 响应周期。

中间件函数myLogger只是打印一条消息,然后通过调用next()函数将请求传递给堆栈中的下一个中间件函数。

Source Expressjs guide article

答案 1 :(得分:1)

如果您想了解如何编写用于快速应用程序的中间件,请按照本指南进行操作

Writing middleware for use in express apps