NodeJ中的事件发射器

时间:2015-09-13 14:47:26

标签: angularjs node.js

我是Nodejs的新手,我正在从网上下载的代码片段中学习。我在聊天应用程序代码中有一个基本问题。

以下是app.js(服务器端)的代码

var stream = collection.find().sort().limit(10).stream(); // collection coming from mongoDb
stream.on('data', function (chat) { 
          socket.emit('chat', chat.content); 
});

socket.on('chat', function (msg) {
  // code to add into mongoDB
}

上面的代码,从mongoDB获取记录并发出在客户端捕获的数据,还有一个函数,它监听从客户端推送的数据是否插入到数据库中。

客户端代码 -

var socket = io();
$('#send-message-btn').click(function () { // this is a button
    var msg = $('#message-box').val();
    socket.emit('chat', msg);
    $('#messages').append($('<p>').text(msg));
    $('#message-box').val('');
    return false;
});
socket.on('chat', function (msg) {
    console.log('adding to message div '+msg);
    $('#messages').append($('<p>').text(msg));
});

现在我的问题是,app.js中的socket.emit已被socket.on中的client.js方法捕获,socket.emit中的socket.on按钮lick函数在{{1}中捕获在服务器端。

怎么运作?为什么app.js的socket.emit没有在app.js中的socket.on方法中捕获,并且在客户端ja的socket.on方法中没有捕获到相同的客户端js的emit方法。

我知道这是一个非常基本的问题,但请帮助我理解。

1 个答案:

答案 0 :(得分:0)

socket.on侦听来自另一方的消息。

基本上,当您执行socket.emit('chat', chat.content);时,您应指定将其发送给哪个用户。

您可以选择几个选项,或者在某处保留一个套接字列表,您可以根据sessionId / username或其他内容找到它们。或者你可以使用回调。

client.js

$('#send-message-btn').click(function () { // this is a button
var msg = $('#message-box').val();
socket.emit('chat', msg, function(res) {
    console.log('adding to message div '+msg);
    $('#messages').append($('<p>').text(msg));
);
$('#messages').append($('<p>').text(msg));
$('#message-box').val('');
return false;
});

并在服务器中

socket.on('chat', function (msg, cb) {
    var stream = collection.find().sort().limit(10).stream(); // collection coming from mongoDb
    stream.on('data', function (chat) { 
         cb(chat.content); 
    });
});