javascript - 快速路由socket.io发出客户端未捕获的数据

标签 javascript node.js sockets express

我能够在 ExpressJS 路由文件中发出套接字。但客户端 JavaScript 不会读取发出的数据。

server.js

var express = require('express');
var path = require('path');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var bodyParser = require('body-parser');


app.use(express.static(__dirname + '/node_modules'));
app.use("/css", express.static(__dirname + '/css'));
app.use("/js", express.static(__dirname + '/js'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.set('io', io);

var aws_router = require('./app/routes')(app);

server.listen(8080);

app/routes.js

var express = require('express');
var router = express.Router();
var bodyParser = require('body-parser');
var path = require('path');
var process = require('process');



var aws_router = function(app, io){

  app.get('/', function(req, res) {
    //need to read from database
    var socketio = req.app.get('io');
      var objShopper = "hello"
      console.log(objShopper)
      socketio.emit("viewdata", objShopper);
      res.sendFile(path.join(process.cwd() + '/index.html'));
  });
  return router;
}

module.exports = aws_router;

套接字发出部分工作正常,至少我没有看到错误并在控制台中输出 hello。但是当我尝试从客户端 JS 读取发出的数据时,我无法读取它。

client.js

$( document ).ready(function() {

    var socket = io.connect('http://localhost:8080');
    socket.on('viewdata', function (results) {
        console.log("read data");
        var objShopper = JSON.parse(results);
    });

});

“读取数据” 永远不会显示在控制台中。我错过了什么?

最佳答案

您遇到了时间问题。您正在尝试在连接之前发送到套接字。以下是事件的顺序:

  1. 浏览器请求 http://yourdomain/来自您的服务器。
  2. 您的 / 快速路线收到请求。
  3. 您获取 io 实例并执行 io.emit()
  4. 然后发送index.html以满足浏览器请求。
  5. 浏览器解析生成的文件
  6. 浏览器运行您的 Javascript,从而与您的服务器建立 socket.io 连接。

希望您可以看到步骤 6 发生在步骤 3 之后很久,或者换句话说,步骤 3 发生在当前请求的页面甚至与服务器建立 socket.io 连接之前。因此,当您执行 io.emit() 并迭代所有当前连接以将消息发送给所有连接时,当前请求的页面不在该列表中,因为它的连接尚未建立。哎呀,用于建立连接的 Javascript 页面甚至还没有发送到浏览器。

<小时/>

请求页面时已知的数据应该放入页面中。目前还没有 socket.io 连接,因此您无法将其发送到那里。如果您希望它出现在页面中,请在页面中发送。

如果您不想将其放在初始页面中(出于某种原因),那么您可以让页面加载并运行,并让页面中的 Javascript 通过 Ajax 调用从您的服务器请求数据,或者当您的 Javascript 使用 socket.io 连接到服务器并且服务器看到传入的 socket.io 连接时,它可以发送数据(由于此时建立了 socket.io 连接,因此计时现在是正确的)。

关于javascript - 快速路由socket.io发出客户端未捕获的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48592536/

相关文章:

javascript - 如何在 node.js 中使用 q.defer 来链接 promise ?

objective-c - 在 XCode 6 中找不到 sockaddr_in(在 OS X 10.10 Yosemite 上)

node.js - NodeJS gm同步获取图像大小

Python:套接字连接仍然打开

python - 我的 socket 和 pickle 有问题。值​不保存到 txt 中

javascript - 如果使用 dom-repeat 在纸质对话框上选中复选框,如何显示值

javascript - 删除自定义标记(Google map 方向 API)

javascript - 语义-UI-React 转换

java - Mozilla Rhino 如何使用 nodejs "fs"模块?

node.js - 仅在一台服务器上测试不和谐机器人discordjs