【发布时间】: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