【问题标题】:Trouble emitting information on clientside with socket.io使用 socket.io 在客户端发送信息时遇到问题
【发布时间】:2014-03-19 18:19:20
【问题描述】:

我正在使用 express.js、mongoose、jquery 和 socket.io

我正在尝试将对象“allFightScores”传递给客户端的套接字。这是我在 routes/index.js 中向 mongoose 请求信息的地方:

var models = require('../models/index.js');
var passport = require('passport');
var crawl = require('../crawler.js');
var flash = require('connect-flash');
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);

exports.submit_scores = function(req, res){

  var scored_fight = new models.UserScore({
    "f1": req.body.f1,
    "f2": req.body.f2,
    "f1_roundScores": req.body.f1_roundScores,
    "f2_roundScores": req.body.f2_roundScores,
    "f1_score": req.body.f1_score,
    "f2_score": req.body.f2_score,
    "user_email": req.body.user_email
  });

  models.UserScore.find({
    "f1": scored_fight.f1,
    "f2": scored_fight.f2,
    "f1_score": scored_fight.f1_score,
    "f2_score": scored_fight.f2_score,
    "user_email": scored_fight.user_email
  }, function(err, data){
    if (data.length === 0){
      scored_fight.save(function(err, user_fight){
        if (err) {
          return "error";
        }
        else {
          models.UserScore.find({"f1": user_fight.f1, "f2": user_fight.f2}, function(err, allFightScores){
            console.log("from index-routes " +allFightScores);
            io.sockets.emit('show scores', allFightScores)
          })
        }
      })
      //put a callback on the user_scored_fight data, also emit that data with the average scores;
      res.json(scored_fight);
    }
    else if (data[0].f1 === scored_fight.f1 && data[0].f2 === scored_fight.f2 && data[0].user_email === scored_fight.user_email) {
      res.json(200);
      console.log("data already judged.");
    }
  })
}

这是我在客户端 (public/javascripts/script.js) 上捕获数据的地方:

jQuery(function($){
  socket = io.connect();

  var $group_f1_score = $('#gf1_score');
  var $group_f2_score = $('#gf2_score');

  socket.on('show scores', function(mongooseData){
    console.log("mongooseData from scripts " + mongooseData)

    $group_f1_score.empty();
    $group_f2_score.empty();

  //sum fighter scores for all user submissions
    var f1_sumScore = 0;
    var f2_sumScore = 0;
    for (var i = 0; i < mongooseData.length; i++){
      f1_sumScore += mongooseData[i].f1_score;
      f2_sumScore += mongooseData[i].f2_score;
    }
    //get the simple average
    var f1_avgScore = f1_sumScore/mongooseData.length;
    var f2_avgScore = f2_sumScore/mongooseData.length;

    $group_f1_score.append(f1_avgScore);
    $group_f2_score.append(f2_avgScore);
  })
})

我不确定为什么数据没有发送到我的客户端并且我没有想法。我是否正在查询数据并将其正确传递到回调中?

【问题讨论】:

  • socket.io 日志显示了什么?它记录传入连接吗?它会记录它发出的消息吗?查询执行没有错误?
  • @Phoenix 它没有记录它应该发出的消息。我认为我的 routes/index.js 文件中没有正确发射。如果有机会,这里是 github 上的完整代码。 github.com/kyu1012/FightScores
  • 你为什么要创建第二个 http 服务器来服务 socket.io?您应该将您的 socket.io 与 app.js 中的 express 实例绑定,而不是与 routes/index.js. 尝试处理数据库回调的传入 socket.io 连接 outside 在启动 http 之前放置它服务器。
  • @Phoenix - 除了在 db 回调中调用控制器中的 socket.io 之外,我不确定如何从数据库中发出数据。你有什么建议吗?我所做的是:1)在 app.js(第 27 行)中全局要求 socket.io 2)在 routes/index.js(第 10 行)中删除 socket.io 要求,它正在正确发射。您对此有何看法?
  • 看起来不错。当我说要在 db 回调之外处理传入的 socket.io 连接时,我的意思是更多的 io.sockets.on('connection'app.js 但应该在查询数据库后调用 emitting注意,当您发送请求和数据库回调时,您不必调用io.sockets.emit,而数据库回调又会向套接字发送更新。请记住,这不依赖于该请求来查询您的数据库。您可以每 X 次从数据库进行轮询更改,并向所有连接的客户端发送更新。

标签: javascript node.js mongodb express socket.io


【解决方案1】:

我在你的代码中看不到这个:

server.listen(port);

【讨论】:

  • 我没有在上面包含我的服务器文件,但它在我的 app.js 文件中,从第 81 行开始。完整代码在这里:github.com/kyu1012/FightScores
猜你喜欢
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 2015-01-16
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多