我无法让我的应用程序按照我的意愿运行...我想要做的是从socket.io客户端(emitter.js)向socket.io服务器(接收器)发送消息。 js)然后在使用Express / EJS(index.ejs)生成的页面上显示消息
到目前为止,我所取得的成就是:
// receiver.js
// This script initiates a simple HTML page using Express/EJS
// and then wait for socket.io connection on port 3000
const express = require('express')
const app = express()
const http = require('http')
app.set('view engine', 'ejs')
app.use(express.static('public'))
app.get('/', function (req, res) {
res.render('index.ejs', {params: 'some_params'})
})
app.server = http.createServer(app)
var io = require('socket.io')(app.server)
io.on('connection', function (socket) {
socket.emit('init', 'Init OK !')
console.log('init page ok')
socket.on('new_data', function(msg) {
console.log('socket.on received new data : ', msg)
socket.emit('new_data', 'Test')
})
})
app.server.listen(3000, function () {
console.log('Main app listening on port 3000')
})
附加的index.ejs文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
</head>
<body>
<div id='new_msg'></div>
<script type="text/javascript">
$(document).ready(function() {
var socket = io()
socket.on('init', function(msg) {
console.log(msg)
$('#new_msg').html(msg)
})
socket.on('new_data', function(msg) {
console.log(msg)
$('#new_msg').html(msg)
})
});
</script>
</body>
最后,emitter.js脚本:
// emitter.js
// Open io on port 3000 and then send a msg
var io = require('socket.io-client')
var socket = io.connect('http://localhost:3000')
socket.on('connect', function() {
socket.emit('new_data', 'some_new_data')
console.log('Send some_new_data')
})
然后我使用node receiver.js
运行服务器
应用程序启动,在控制台中我有消息:主应用程序在端口3000上侦听,当我打开浏览器到http://localhost:3000时,我可以看到第一条消息Init OK!
因此,receiver.js可以成功发射到index.ejs!
然后我使用node emitter.js
运行客户端。在发射器的控制台中,我有消息'send some_new_data',并且在接收器的控制台中我有消息'socket.on收到新数据:some_new_data'。
因此,emitter.js可以成功发射到可以成功接收它的receiver.js。
但是,我的问题在于,最后一行socket.emit('new_data', 'Test')
是否未执行(或无效),因为HTML页面根本没有刷新....
所以,我不明白为什么在初始化期间从接收器向index.ejs发出消息但是之后没有工作?? ...
如果有人对这个问题有一些想法,那么任何帮助都会非常感激!
答案 0 :(得分:1)
当receiver.js
收到new_data
消息时,它会:
socket.emit('new_data', 'Test')
它只是发送回发送消息的套接字(这是另一个节点应用emitter.js
)。这不会发送到网页。
如果您尝试向所有连接的网页广播,那么您可以使用以下方式进行广播:
io.emit('new_data', 'Test')