【问题标题】:How do I dynamically update socket.io callbacks without restarting the server?如何在不重新启动服务器的情况下动态更新 socket.io 回调?
【发布时间】:2013-10-01 18:04:19
【问题描述】:

如果我有一个文件目录,该目录的格式如下:

module.exports =
  'add': (socket, data...) ->
    console.log 'words:add handler'.rainbow, data...
    socket.emit 'talkback', 'hahahha'

我如何包含这些文件,当它们被更改时,更新所有连接的 socket.io 客户端以使用新的回调。

如果文件名是words.controller.coffee,我希望回调是words:add

所以每次新的套接字连接时,我如何让每个已经加载的文件绑定到套接字。当一个文件发生变化时,它应该停止监听那个文件,然后开始监听新的绑定。

【问题讨论】:

    标签: node.js coffeescript socket.io


    【解决方案1】:

    所以这个答案使用了我编写的一个名为loaddir 的库。它遍历一个目录并监视它并使用一些默认值(例如basePath)进行回调。在这种情况下,对于words.controller.coffee,基本路径是words.controller

    cs = require('coffee-script')
    loaddir = require('loaddir')
    handlers = {}
    sockets = []
    
    io.sockets.on 'connection', (socket) =>
    
      # keep track of currently connected sockets
      sockets.push socket
      socket.on 'disconnect', =>
        if -1 isnt (index = sockets.indexOf socket)
          sockets.splice index, 1
        console.log 'disconnected'
    
      # bind the currently loaded files ( we pass the socket along as well )
      _.each handlers, (event, event_name) =>
        socket.on event_name, -> event socket, arguments...
    
    # Watches the directory for changes
    loaddir
    
      path: ROOT + 'sockets' # this is our directory
    
      callback: ->
    
        # @basePath is provided by loaddir, in this case 'words.controller'
        module_name = @baseName.split('.')[0]
    
        # unbind the sockets that are currently connected
        _.each handlers, (event, nested_event_name) =>
    
          # only unbind for this file
          # nested_event_name == 'words:add'
          if nested_event_name.split(':')[0] == module_name
            _.each sockets, (socket) =>
              socket.removeListener nested_event_name, event
            delete handlers[nested_event_name]
    
        # Eval because we don't want to restart the server each time
        # @fileContents is provided by loaddir, we use coffeescript to compile it
        module_handlers = eval 'var module = {}; ' + (cs.compile @fileContents) + ' module.exports'
    
        # bind the currently connected sockets with this files events
        _.each module_handlers, (event, event_name) =>
          # event_name == 'add'
          handlers[module_name + ':' + event_name] = event
          _.each sockets, (socket) =>
            socket.on module_name + ':' + event_name, -> event socket, arguments...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多