【问题标题】:next() call in express-ws module in nodejsnodejs 中 express-ws 模块中的 next() 调用
【发布时间】:2016-11-23 06:39:47
【问题描述】:

我遇到了一个示例代码,用于我的网络服务器,它使用 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 有什么用?

【问题讨论】:

    标签: node.js express websocket


    【解决方案1】:

    它调用堆栈中的下一个middleware

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

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

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

    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

    【讨论】:

    • 嗨,中间件是在每个 websocket 请求中调用还是在建立连接时的初始握手期间调用?
    【解决方案2】:

    如果您想了解如何编写用于快速应用的中间件,请遵循本指南

    Writing middleware for use in express apps

    【讨论】:

      猜你喜欢
      • 2020-01-14
      • 2012-09-27
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2021-11-19
      • 2023-01-31
      相关资源
      最近更新 更多