我正在使用Node.js进行第一步操作,我想知道是否有某种方法可以从客户端调用js方法定义服务器端(使用Node.js)。例如
function read_file_server_side(id){
// Do stuff on the server side.
}
然后,我们需要能够从客户端调用该方法。当然,我理解使用REST原理包装服务器端方法是可能的;即将其作为web服务公开给客户端,并使客户端使用HTTP请求。但是,如果可以直接使用该函数,它就会派上用场。
我宁愿把你指向Now.js,而不是socket.io。它正是你想要的:在客户端的服务器端共享功能。
关于节点的问题是,所有东西都有模块。对于所有内容,都有一个"初始提交",很可能在github中。在这种情况下,每个应用程序都要从客户端向服务器发出请求,或者换句话说,进行RPC调用。在这种情况下,基本的传输方法是ajax。在一些现代浏览器上,我们有websocket。对于ajax,这是最简单的方法,您可以制作您想要的东西:
客户端:
var request.ajax('/ajax/setLolz', {data : 'nice', type : 'post'})
request.done(function(msg) {
$("#lolz").html( msg );
});
在服务器端:
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');
这是一个简单的ajax。使用connect:可以让它变得更好
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);
或更简单的快递:
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);
是的,有很多模块可以帮助你。
至于websocket,我所知道的最快的websocket服务器是ws。尽管有些浏览器可能不支持它。
客户端:
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 );
}
服务器上:
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);
});
然后是socket.io,它让事情变得容易多了。它是跨浏览器的,适用于所有地方。基于ajax和websocket以及其他一些方法构建。您将所有内容都修补到事件中。你甚至可以在监听同一端口的http服务器旁边使用它
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
});
但它仍然不够简单,所以现在我向您介绍nowjs。
在浏览器上:
now.setLolz(function(data){
$("#lolz").html( data );
});
在服务器端:
var nowjs = require("now");
var app = nowjs.initialize(httpServer);
app.now.setLolz = function(cb){
cb(lolz);
lolz = data;
someOtherFunction();
}
我不想更深入,但我希望你明白要点。还有其他模块(dnode、hook.io、flatiron、railwayjs、racer、motivejs…)可以帮助您。是的,你总是可以自己做。
快乐编码…:D
看看这里:Socket.IO
您基本上可以简单快速地在服务器端调用一个方法。
服务器:
socket.on('doAwesomeStuff', function (data) {
startDoingAwesomeStuff();
}
function startDoingAwesomeStuff() {
// this would be the remotely invoked method.
...
}
客户:
socket.emit('doAwesomeStuff', { my: 'data' });