Javascript 将方法添加到";插座;来自“的对象”;WebSocket/ws";图书馆

Javascript 将方法添加到";插座;来自“的对象”;WebSocket/ws";图书馆,javascript,node.js,websocket,Javascript,Node.js,Websocket,非常感谢您的帮助 背景:我正在构建一个Node.js支持的网站,其中WebSocket就是其中的一部分。我目前正在使用图书馆 Desire:我希望能够创建一些“包装器”发送函数,以便在我的每个套接字消息处理程序中,如果我选择更改它,可以更容易地维护该功能。下面是我目前正在做的一些示例代码: const wss = new ws.Server({ perMessageDeflate: false, path: '/ws', server: httpServer, v

非常感谢您的帮助

背景:我正在构建一个Node.js支持的网站,其中WebSocket就是其中的一部分。我目前正在使用图书馆

Desire:我希望能够创建一些“包装器”发送函数,以便在我的每个套接字消息处理程序中,如果我选择更改它,可以更容易地维护该功能。下面是我目前正在做的一些示例代码:

const wss = new ws.Server({
    perMessageDeflate: false,
    path: '/ws',
    server: httpServer,
    verifyClient: function() { /* doing stuff here for client verification */}
});

wss.on('connection', function onConnect(socket, request) {
    // Using Lodash to extend the socket object to add the methods I need.
    _.assignIn(socket, {
        sendOk: function sendOk(message) {
            return socket.send(JSON.stringify({
                ok: true,
                msg: message
            }));
        },
        sendErr: function sendErr(message) {
            return socket.send(JSON.stringify({
                ok: false,
                msg: message
            }));
        }
    });

    socket.on('message', function onIncomingMessage(message) {
        try {
            let jsonMessage = JSON.parse(message);

            console.log('Successfully parsed incoming WebSocket message.');

            return this.sendOk('Thanks for the update!');
        }
        catch (err) {
            console.error('Error when parsing incoming WebSocket message.');

            return this.sendErr('Your incoming message was not a JSON string.');
        }
    });
});
问题:使用这种方法,每次新用户连接到套接字时(在初始握手之后),我都会扩展“套接字”对象,这可能会导致很多问题(例如,用户可以在Lodash完成对象扩展之前连接并发送消息;服务器将遇到性能问题,因为该扩展是一项昂贵的操作;等等)。我需要能够找到一种方法在服务器启动时执行此操作,以便在WebSocket服务器开始侦听传入连接之前,所有传入套接字都已包含我需要的方法

问题:使用这种方法,每次新用户连接到套接字(在初始握手之后)时,我都会扩展“套接字”对象,这可能会导致很多问题(例如,用户可以在Lodash完成对象扩展之前连接并发送消息

事实并非如此。Lodash对象扩展是同步的,Javascript是单线程的。因此,在
连接事件之后,但在对象扩展就位之前,您没有机会处理事件。这是不可能的

服务器将遇到性能问题,因为该扩展是一个昂贵的操作(等等)。我需要在服务器启动时找到一种方法来执行此操作,以便所有传入套接字都已包含在WebSocket服务器开始侦听传入连接之前所需的方法

扩展不是一个昂贵的操作。它只是为一个对象分配了几个属性。这将非常非常困难地与服务器性能相关的瓶颈相关联

如果你真的真的想避免在每个新连接上分配几个属性,你可以修改你的webSocket库正在使用的任何东西的原型。你可能必须检查该库的来源,以确定原型是什么,以及你是否可以修改它。就我个人而言,我发现这比你所做的更脆弱我们现在这样做是因为原型可能不是接口的文档化方面


通过像您现在这样添加属性来扩展外部对象(您不直接调用其构造函数的对象)是完全合理的。这可能更安全(从长期维护的角度来看)而不是向原型中添加东西,除非对象的文档专门记录了向原型中添加东西。甚至有可能该对象甚至不使用原型(如我所说,您必须查看代码,看看它是否使用以及您是否可以访问).

您应该使用socket.io。@SLaks socket.io/Engine.io都有已知的性能问题,以及我不需要的其他库功能。“websocket/ws”库具有我需要的一切和我期望的性能。我只是想给这个很棒的库添加一些次要功能。“例如,用户可以在Lodash完成对象扩展之前连接并发送消息。”Node.js是单线程的,传入消息不能抢占Lodash。“服务器将遇到性能问题,因为该扩展是一项昂贵的操作“。你为什么还需要Lodash?只需分配给
socket.sendOk
。或将你的附加方法添加到。除非你处理的是极端的负载水平,否则性能会很好。不要重新发明轮子。@robertklep=>即使这可能是真的,我总是假设JavaScript中的每个函数调用都是正确的。”(是的,甚至是Lodash中的库函数)都是异步的。这就是我为什么这么说的原因。虽然我知道我可以使用本机JavaScript方法来完成同样的事情,但我通常发现使用Lodash更安全,因为我已经习惯了它在浏览器中的存在及其美。这正是我所期望的。你可以看到我对“sync vs async”是我在上面的帖子中对@robertklep的评论。我认为扩展对象并不是一项昂贵的操作,但是如果有人知道如何在服务器创建时而不是在用户连接时扩展对象(我知道,这里的措辞很糟糕),然后我会认为它会提供更好的性能。谢谢你重新恢复我已经感觉到的是正确的选择。