javascript - Node.js:在express.js 路由中使用Socket.io 将消息发送到特定客户端

标签 javascript node.js sockets express socket.io

我做了一个很随意的评论系统,现在想添加回复。因此,当某人对其他人的评论发表回复时,必须通知该用户有人回复了他们的评论。为此,当回复者单击回复按钮时,会向服务器发出 AJAX post 请求,然后服务器需要获取第一个评论者的 id 并使用 socket.io 向他们发送响应文本(socket.io 是如果有其他方法可以使用其他模块发送回复文本或表达自身,则不需要使用)。这是我到目前为止的代码:

app.post('/reply', function(req, res){
  var commenterId = req.body.userId; // this is the id of the original commenter, not the replier
  User.findOne({'_id':commenterId}, function(err, user){
    user.send({'replied': req.user._id}); // this is what I need to do, and
  //I don't know if this specific code works and that's why I'm asking if there is a way to do it with socket.io,
  // io.to(socketId).emit('reply', 'some reply text here...'); // but if I do this I don't know how to get the socketId!
  //Is there even a way to do this? Maybe with another module,
  //or some express function I don't know about? And if it is done with express how would
  //the client side code, look like? Thank you!
  });
  res.end();
});

最佳答案

//app.js file   
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
var routes = require('./routes/routes')(io);
app.use('/', routes);

//router file
var express = require('express');
var router = express.Router();
var _socket = null;

//list of socket users.once they logout delete the socket by 
//delete users[_socket.userid];
var users = {};

var returnRouter = function(io) {

    io.sockets.on('connection', function (socket) {
        //now _Socket is available inside routes
       _socket =  socket;
    });

    router.post('/login', function(req, res) {
        //authentication logic
        User.findOne({'email': req.body.email}, function (err, user) {

           //userid must be unique
           _socket.userId= user.userId
           //set session variable to store id of the user
           req.session.userId = user.userId;
           //now every user has a socket associated with their id
           users[_socket.userId] = _socket;
        });
    });

    router.post('/reply', function (req, res) {
       var commenterId = req.body.userId;
       User.findOne({'_id': commenterId}, function (err, user) {

       // you can get the id of the logged in user that is the creator
       //of the original post from req.session.userId
       //if you have implemented session store

       //the commenter user object is obtained from findOne method
       users[req.session.userId].emit('notification', {
         notification: user.username+' commented on your post'
       }});
       });
       res.end();
    });

    return router;
};
module.exports = returnRouter;

关于javascript - Node.js:在express.js 路由中使用Socket.io 将消息发送到特定客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37368293/

相关文章:

javascript - 在javascript中使用php数组填充 'select' ajax

javascript - 如何仅打印包含在 php 代码中的 html,如打印收据

javascript - 将可点击的坐标图像更改为 css

javascript - 分割并展平逗号分隔字符串的数组

node.js - cordova requireCordovaModule() 与 require()

javascript - Express.js : Match route in catch all

java - 如何将多个客户端连接到单个服务器?

javascript - 将更多信息拖入现有事件

python - 通过代理服务器进行socket编程

c++ - 如果客户端的互联网断开连接,客户端套接字不会关闭。如何在服务器中检测到此事件?