所以這個答案利用了我寫的名爲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...