2012-03-26 12 views
2

Ich mache meine ersten Schritte mit Node.js und ich fragte mich, ob es eine Möglichkeit gibt, eine JS-Methode zu starten Server-Seite (mit Node.js) definieren, sondern von der Client-Seite. z.B.Node.js Methode Aufruf aus der Ferne

function read_file_server_side(id){ 
    // Do stuff on the server side. 
} 

und dann von der Client-Seite müssen wir in der Lage sein, die Methode aufzurufen. Natürlich verstehe ich, dass es möglich ist, die serverseitige Methode mit REST-Prinzipien zu umbrechen; d. h. es dem Client als Web-Service verfügbar machen und die Clients HTTP-Anfragen verwenden. Aber es ist praktisch, wenn man die Funktion direkt nutzen kann.

Antwort

3

Statt socket.io, würde ich Sie lieber zu Now.js zeigen. Es macht genau das, was Sie wollen: share funktioniert serverseitig auf der Client-Seite.

+0

Vielen Dank! Sieht aus wie genau ich brauche! –

+0

Cool! Markieren Sie die Antwort dann als die gute :-) –

+0

Haben Sie Geduld! Es gibt trotzdem eine Zeitbeschränkung zwischen der Zeit, in der Sie eine Frage stellen, und der Zeit, in der Sie sie annehmen können. Aber natürlich, hier ist die grüne Zecke für Sie! –

1

Werfen Sie einen Blick hier: Socket.IO

Sie können im Grunde ein Verfahren auf der Server-Seite einfach und schnell aufrufen.

Server:

socket.on('doAwesomeStuff', function (data) { 
    startDoingAwesomeStuff(); 
} 

function startDoingAwesomeStuff() { 
    // this would be the remotely invoked method. 
    ... 
} 

Auftraggeber:

socket.emit('doAwesomeStuff', { my: 'data' }); 
+0

Ich sah nicht, wie man eine Methode aufrufen kann, die von der Client-Seite auf dem Server liegt. Ist es möglich? Können Sie ein Beispiel angeben (sogar Pseudocode)? –

+0

Aktualisiert, um Beispiel hinzuzufügen. –

3

Nun, die Sache mit Knoten ist, es gibt Module für alles. Für alles gibt es eine "initial commit" und höchstwahrscheinlich in GitHub. In diesem Fall ist es Teil jeder App, vom Client aus eine Anfrage an den Server zu senden oder mit anderen Worten einen RPC-Anruf zu tätigen. Die grundlegende Transportmethode ist in diesem Fall Ajax. Und in einigen modernen Browsern haben wir Websockets. Für Ajax ist dies die einfachste Methode, die Sie etwas, was Sie wollen machen:

Auf Client-Seite:

var request.ajax('/ajax/setLolz', {data : 'nice', type : 'post'}) 

request.done(function(msg) { 
    $("#lolz").html(msg); 
}); 

auf Server-Seite:

var url = reruire('url') 
var http = require('http'); 
var lolz = 'wow'; 
var methods = { 
    '/ajax/setLolz' : function (action, body, res) { 
    res.end(lolz); 
    lolz = body; 
    someOtherFunction(); 
    } 
} 

http.createServer(function (req, res) { 
    var body = ''; 
    var action = url.parse(req.url); 

    req.on('body', function(text) { 
    body += text; 
    } 

    req.on('end', function() { 
    methods[action.path](action, body, res); 
    } 

}).listen(1337, '127.0.0.1'); 

Das war einfach Ajax. Sie machen es ein wenig besser durch connect mit:

var connect = require('connect'); 
var app = connect() 
    .use(connect.bodyParser()) 
    .use(function(req, res){ 
    var action = url.parse(req.url); 
    methods[action.path](action, body, res); 
    }) 
.listen(1337); 

Oder mehr einfacher mit express:

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

app.get('/ajax/setLolz', function(req, res){ 
    res.end(lolz); 
    lolz = req.body; 
    someOtherFunction(); 
}); 

app.listen(1337); 

Und ja, es gibt viele modules, die Ihnen helfen können.

Ab Websockets ist der schnellste WebSocket-Server, den ich kenne, ws. Obwohl einige Browser dies nicht unterstützen.

Auf Client-Seite:

websocket = new WebSocket('ws://www.host.com/ws'); 
websocket.onopen = function(evt) { 
    websocket.send(JSON.stringify({method : 'setLolz', msg : 'yes '}; 
}; 
websocket.onmessag = function(evt) { 
    $("#lolz").html(evt.data); 
} 

Auf Server:

var WebSocket = require('ws'); 
var ws = new WebSocket('ws://www.host.com/ws'); 
var methods = { 
    'setLolz' : function (msg, ws) { 
    ws.send(lolz); 
    lolz = msg; 
    someOtherFunction(); 
    } 
} 

ws.on('message', function(data, flags) { 
    data = JSON.parse(data); 
    methods[data.method](data.msg); 
}); 

Dann gibt es die socket.io, dass die Dinge viel einfacher macht. Es ist Cross-Browser und funktioniert überall. Erbaut auf Ajax und WebSockets und einigen anderen Methoden. Sie patchen alles auf Ereignisse. Sie können es sogar neben einem http-Server verwenden, der denselben Port abhört.

var io = require('socket.io').listen(1337); 

io.sockets.on('connection', function (socket) { 
    socket.on('setLolz', function(data) { 
    socket.emit('lolz', lolz); 
    lolz = data; 
    }); 
    socket.on('setLolz', someOtherFunction);// Yes, you can listen to an event with two functions 
}); 

Aber es ist immer noch nicht einfach genug, so dass nun stelle ich Ihnen nowjs.

On-Browser:

now.setLolz(function(data){ 
    $("#lolz").html(data); 
}); 

Auf Server-Seite:

var nowjs = require("now"); 
var app = nowjs.initialize(httpServer); 

app.now.setLolz = function(cb){ 
    cb(lolz); 
    lolz = data; 
    someOtherFunction(); 
} 

Ich will nicht in tiefer gehen, aber ich hoffe, dass Sie den Kern bekommen. Es gibt auch andere Module (Dnode, Hook.io, Flatiron, Railwayjs, Racer, Locomotivjs, ...), die Ihnen helfen können. Und ja, du kannst immer dein eigenes machen.

Glücklich Codierung ...: D

Verwandte Themen