如何在 sails 控制器中获取当前套接字对象或 id?

2023-12-10

我想访问当前连接的套接字 IDsails.js (v0.12)控制器功能。 sails.sockets.getId(req.socket);显示未定义,因为这不是套接字请求

我的目标是在用户成功登录后在数据库中设置用户的在线状态

login: function (req, res) {

    Util.login(req, function(){
        var socketId = sails.sockets.getId(req.socket);
        console.log('socketId ===', socketId); // return undefined
    });
},

基本上我想访问控制器中当前用户的套接字对象或访问当前用户的会话对象socket on method

我也不确定如何重写我的旧的套接字.onConnect处理程序

 onConnect: function(session, socket) {
// Proceed only if the user is logged in

if (session.me) {
    //console.log('test',session);

    User.findOne({id: session.me}).exec(function(err, user) {
        var socketId = sails.sockets.getId(socket);

        user.status = 'online';
        user.ip = socket.handshake.address;

        user.save(function(err) {
          // Publish this user creation event to every socket watching the User model via User.watch()
          User.publishCreate(user, socket);
        });

        // Create the session.users hash if it doesn't exist already
        session.users = session.users || {};

        // Save this user in the session, indexed by their socket ID.
        // This way we can look the user up by socket ID later.
        session.users[socketId] = user;

        // Persist the session
        //session.save();

        // Get updates about users being created
        User.watch(socket);

        // Send a message to the client with information about the new user
        sails.sockets.broadcast(socketId, 'user', {
          verb :'list',
          data:session.users
        });
    });
}
},

您需要通过req反对该方法。

if (req.isSocket) {
    let socketId = sails.sockets.getId(req);
    sails.log('socket id: ' + socketId);
}

由于请求不是套接字请求,因此您可能需要执行类似的操作

  • 登录后将一些标识符发送回客户端。
  • 使用标识符加入房间。 (每个房间一名用户。)
  • 每当您需要向客户端发送消息时,都会向带有标识符的房间广播消息。

https://gist.github.com/crtr0/2896891

Update:

从帆迁移指南

onConnect 生命周期回调已被弃用。相反,如果您需要在连接新套接字时执行某些操作,请从新连接的客户端发送请求来执行此操作。 onConnect 的目的始终是为了优化性能(消除与服务器进行初始额外往返的需要),但它的使用可能会导致混乱和竞争条件。如果您迫切需要消除服务器往返,您可以直接在 bootstrap 函数 (config/bootstrap.js) 中的 sails.io.on('connect', function (newlyConnectedSocket){}) 上绑定处理程序。但请注意,不鼓励这样做。除非您面临真正的生产性能问题,否则您应该将上述策略用于“连接时”逻辑(即在套接字连接后从客户端发送初始请求)。套接字请求是轻量级的,因此这不会给您的应用程序增加任何有形的开销,并且有助于使您的代码更具可预测性。

// in some controller
if (req.isSocket) {
    let handshake = req.socket.manager.handshaken[sails.sockets.getId(req)];
    if (handshake) {
        session = handshake.session;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 sails 控制器中获取当前套接字对象或 id? 的相关文章

  • Mac + Ruby:无法访问 Socket 的 ioctl?怎么修?

    一天中的好时光 红宝石代码 def hw address iface sock Socket new Socket AF INET Socket SOCK DGRAM 0 buf iface pack a16h16 sock ioctl S
  • 套接字错误 10054

    我有一个C S程序 客户端使用socket向服务器发送文件 发送后大约超过700k数据 客户端 在win7上 将收到套接字10054错误 这意味着连接被对等方重置 服务器运行在CentOS 5 4上 客户端是在virtual box中运行的
  • NodeJs/WS:如何抛出服务器端在客户端处理的错误?

    当我的 websocket 有超过 2 个连接时 我试图在服务器端抛出错误 我有这个不错的客户端onerror方法 但我无法到达我的代码的那部分 我正在使用 nodeJS 和包ws其中有关于错误处理的最小文档 服务器 js theWebSo
  • 角度编译速度慢

    我有一个API in Symfony PHP 我用它来测试postman它就像一个魅力 但当我这样做时ng serve aot optimization应用程序开始构建并且消息compiled successfully 需要一分多钟 当我需
  • 在node.js 0.12.x中使用libuv函数

    我写了一个node js c 插件 在node js 0 10 x下可以成功编译 但是当迁移到0 12 x时 出现了一些错误 例如error C2065 uv work t undeclared identifier 我想知道我是否可以在0
  • 是否可以直接获取 Puppeteer 音频源和/或输入音频到 Puppeteer?

    我想将 WAV 或 MP3 输入到 puppeteer 作为麦克风 但是在无头模式下应用程序被静音 所以我想知道是否有一种方法可以直接将输入输入到浏览器中 我还想知道是否可以在无头状态下从浏览器获取音频源 和 或录制音频并将其放在文件夹中
  • 将项目中的node_modules集中到子项目中

    是否可以以在中心点上拥有所需模块的方式配置 grunt 我有以下项目结构 Project subproject subproject subproject 我通过 grunt 构建项目的所有子项目 并且我也可以为自己构建每个子项目 目前 我
  • 使用 Javascript/Node.js 在代码内执行 mongoimport

    node js javascript 中是否有任何库可供个人使用mongoimport在代码中 据我了解 mongoimport 有点像 exe 您必须先执行它 然后才能使用其文本输入环境 是否可以在我的代码中执行 mongoimport
  • 让 Jest 全局设置和全局拆卸在 TypeScript 项目中工作

    我想运行一个在运行测试之前打开数据库连接的函数 全局设置 以及另一个在运行测试后关闭数据库连接的函数 全局拆卸 目前我有以下配置 包 json jest testEnvironment node globalSetup src jest g
  • if(err) 抛出错误;错误:非法参数:字符串,未定义

    我现在有 module exports comparePassword function candidatePassword hash callback console log candidatePassword console log h
  • [node][mocha]使用 mocha 测试时无法访问全局变量

    我正在尝试为快速节点应用程序创建单元测试 我希望用于测试的配置与生产中使用的配置不同 因此我实现了以下内容 In my index js 我将配置加载到全局变量中 如下所示 global env global env config requ
  • C# 中的 Unix 套接字

    我正在尝试使用 Mono 的 UnixEndPoint 但在使用它之前就失败了 我在 64 位 Windows 7 系统上运行 Xamarind net 4 5 下面是一些代码 证明单一组合不起作用 foreach SocketType s
  • 获取当前范围内所有定义的变量

    我正在解析一个包含以下内容的网站 hmapId 7 42500000000626135 hmapStartInterv 7 750 hmapEndInterv 7 846 hmapUrlInterv 7 some url hmapNameI
  • 什么是 NPM?为什么需要它? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 以前 我用记事本制作了一些网站 所以我们必须创建一个文件夹 TREE 并在其中放入一个 htm 文件 以及一些文件夹 其中包含 Jav
  • 如何让Python的socket服务器永远运行

    我有这段代码创建了一个简单的Python套接字服务器 但是每次客户端断开连接时它都会关闭 如何让它永远运行 import socket HOST PORT 8000 s socket socket socket AF INET socket
  • 在 Node.js 中一次迭代 50 个项目的数组

    我是 node js 的新手 目前正在尝试编写数组迭代代码 我有一个包含 1 000 个项目的数组 由于服务器负载问题 我想一次迭代 50 个项目的块 我目前使用 forEach 循环 如下所示 我希望将其转换为上述块迭代 result i
  • 将node_modules安装到vendor

    如何在本地为每个项目安装 npm 模块vendor node modules和做package json文件看到他们 我不想将 package json 移动到供应商文件夹 我有凉亭 在 bowerrc我指定bower components
  • 监听外部事件。 Bash 到 NodeJS 的桥梁

    在 NodeJS 进程内部 我如何监听来自 bash 的事件 例如 NodeJS side obj on something function data console log data Bash side do something Hel
  • 在 MySQL 连接字符串中指定密码

    我使用 MySQL 作为 DB 和 Yeoman 生成器创建了 ExpressJS MVC 应用程序 并在config js我想更改 MySQL 连接字符串 但我不知道在字符串中指定密码 我的字符串是mysql root localhost
  • Java,如何管理线程读取socket(websocket)?

    我有一个 WebSocket 服务器 我的服务器创建一个新线程来处理新连接 该线程一直处于活动状态 直到 websocket 中断 我的问题 对于 1 000 000 个连接 我需要 1 000 000 个线程 我如何通过一个线程处理多个

随机推荐