2012-10-23 3 views
7

Ich versuche, eine kleine App in NodeJs zu veröffentlichen und zu abonnieren. Ich stehe fest, wie ich vom Client aus veröffentlichen kann. Hier ist der Code, den ich habe.Nodejs Veröffentlichen von Client in Pub/Sub

Hier ist mein Servercode (server.js)

var express = require('express'), 
app = express(), 
http = require('http'), 
server = http.createServer(app); 
app.use(express.bodyParser()); 

app.get('/', function(req, res) { 
    res.sendfile(__dirname + '/public/index.html'); 
}); 

app.post('/publish/:channel/:event/', function(req, res) { 
    console.log("**************************************"); 
    var params = req.params; 
    console.log(req.params); 
    console.log(req.body); 
    var data = req.body; 
    console.log("**************************************"); 
    var result = io.sockets.emit(params.channel,{event:params.event,data:data}); 
    //console.log(result); 
    console.log("**************************************"); 
    res.sendfile(__dirname + '/public/index.html'); 
}); 

//include static files 
app.use(express.static(__dirname + '/public')); 

server = server.listen(3000); 
var io = require('socket.io').listen(server); 

io.sockets.on('connection', function (s) { 
    socket = s 
    socket.emit('c1', { hello: 'world' }); 

    socket.on('test', function (data) { 
    socket.emit('c1', { hello: 'world' }); 
    console.log('test');console.log(data); 
    }); 
}); 

Und hier ist Client-Code

var narad = {}; 
narad.url = 'http://192.168.0.46:3000'; 

narad.lisentingChannels = {} 

var socket = io.connect(narad.url); 

function Channel(channelName) { 
    this.channelName = channelName; //serviceObject is the object of 
    this.events = {}; 
}; 

Channel.prototype.bind = function (event, callback) { 
    this.events[event] = callback; 
}; 

narad.subscribe = function (channelName) { 
    var channel = new Channel(channelName) 
    this.lisentingChannels[channelName] = channel; 

    socket.on(channelName, this.callbackBuilder(channel)) 

    return this.lisentingChannels[channelName]; 
} 

narad.callbackBuilder = function (channel) { 
    return function (data) { 
    var callback = channel.events[data["event"]]; 
    callback(data.data); 
    } 
} 
+0

Bitte helfen Sie uns, indem Sie einige Erklärungen und/oder Kommentare zu Ihrem Code hinzufügen, insbesondere zu Ihren clientseitigen Socket-Callback-Funktionen. Wo und auf welche Weise möchten Sie, dass Ihr Kunde Daten veröffentlicht? – matthias

+0

Es sieht so aus, als ob Sie versuchen, die POST-Route zu verwenden, damit der Client ein Ereignis veröffentlichen kann. Ist das korrekt? – floatingLomas

Antwort

4

Sie die emit Methode auf dem Client verwenden und den Server websocket Verbindungen genommen von Socket.io:

:
var socket = io.connect(narad.url); 
socket.emit('publish', 'message'); 

Dann auf Ihrem Server hören Sie f oder die Meldung:

socket.on('publish', function (data) { 
    // Emit the published message to the subscribers 
    socket.emit('subscribers', data); 
    console.log(data); 
}); 

diese Weise können Sie die bidirektionale Kommunikation von WebSockets verwenden, ohne etwas POST api zu verwenden.