2012-10-23 26 views
7

Sto provando a creare una piccola app in nodejs per pubblicare e sottoscrivere. Sono bloccato da come posso pubblicare dal lato client. Ecco il codice che ho.Nodejs Pubblica dal client nel pub/sub

Ecco il mio codice del server (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); 
    }); 
}); 

E qui è il codice cliente

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

Aiutateci aiutandovi aggiungendo alcune spiegazioni e/o commenti sul vostro codice, in particolare sulle funzioni di callback della presa sul lato client. Dove e in che modo vuoi che il tuo cliente pubblichi i dati? – matthias

+0

Sembra che tu stia cercando di utilizzare la route 'POST' per consentire al client di pubblicare un evento; è corretto? – floatingLomas

risposta

4

È possibile utilizzare il metodo emit sia sul server connections websocket, presi cliente e da Socket.io:

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

Quindi sul server si ascolta f o il messaggio:

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

In questo modo si utilizza la comunicazione bi-direzionale di WebSockets senza dover utilizzare una certa POST api.

Problemi correlati