【问题标题】:Not able to get Socket Message to ejs无法将套接字消息发送到 ejs
【发布时间】:2018-06-05 04:07:48
【问题描述】:

我正在尝试使用套接字将消息从 Node JS 传递到前端。但是,消息没有被传输。

var express  = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
const path = require('path');
const PORT = process.env.PORT || 5000;

io.on('connection', function(socket){
   io.emit('order', "Order Updated");
   console.log("Order Updated");
}); 

app.use(express.static(path.join(__dirname, 'public')))
  .set('views', path.join(__dirname, 'views'))
  .set('view engine', 'ejs')
  .get('/', (req, res) => res.render('pages/index'));

http.listen(PORT, function(){
  console.log('listening on *:' + PORT);
});

控制台日志打印为Order Updated。在 index.ejs 文件中,我有以下代码,我在 UI 中看不到任何控制台日志。

<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script>
  $(function () {
    var socket = io();
    socket.on('order', function(msg){
      console.log(msg);
      window.scrollTo(0, document.body.scrollHeight);
    });
  });
</script>

更新 1

根据以下答案,我将代码更新为:

io.on('connection', function(socket) {
    socket.emit('order', "Order Updated");
}); 

更新 2

$(function () {
var socket = io.connect('http://127.0.0.1:5000', {transports ['polling']});
   socket.on('order', function(msg) {
      console.log(msg);
   });
});

服务器端控制台日志的图像:

【问题讨论】:

    标签: node.js sockets socket.io ejs


    【解决方案1】:

    也许在您的服务器端,您必须像这样发送到您连接的套接字?

    io.on('connection', function(socket){
       socket.emit('order', "Order Updated");
       console.log("Order Updated");
    }); 
    

    编辑

    在我的客户端,我正在像这样与 host:port 连接,并且它工作正常

    var socket = io.connect('http://127.0.0.1:5000', {transports: ['polling']});
    socket.on('order', function(msg) {
       console.log(msg);
    }
    

    编辑 2

    在我的 index.html(客户端)上,我也像这样调用 socket.io:

    <script src="/socket.io/socket.io.js"></script> <!-- directly get from Node.js server -->
    

    希望对你有帮助。

    【讨论】:

    • 我确实更新了,但我仍然没有看到任何数据传递到 UI。我还有什么遗漏的吗?
    • 也许你应该尝试连接完整的主机:端口,就像我的编辑一样?
    • 我也试过了,还是不行。
    • 并且每次刷新客户端浏览器时都会显示服务器端日志“Order Updated”?
    • 您的编辑 2 是救世主。再次感谢。
    【解决方案2】:

    你应该只发射到连接的套接字:

    io.on('connection', function(socket) {
      socket.emit('order', 'Order Updated');
    });
    

    否则,您将向所有连接的客户端发射,这可能不是您想要的。

    编辑: 您必须在 socket.io 实例化代码中指定要连接的端口:

    var socket = io('http://localhost:5000');
    

    还建议将 URL 和端口存储在变量中,以便在部署到生产环境时轻松配置它们。

    【讨论】:

    • 我确实更新了,但我仍然没有看到任何数据传递到 UI。我还有什么遗漏的吗?
    • 服务器端socket.io配置需要共享代码。也许您根本没有连接到服务器。
    • 我更新了代码,我基本上是在PORT 5000运行的。
    猜你喜欢
    • 2014-11-20
    • 1970-01-01
    • 2016-12-13
    • 2016-11-04
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多