websocket 在socket.io多个.js文件中使用www.example.com的Node.js

k2fxgqgv  于 2022-11-24  发布在  Node.js
关注(0)|答案(3)|浏览(150)

我希望能够在多个.js文件中编写函数,并使用在主server.js中创建的相同套接字
server.js:

var express = require('express')
var app = express()
var http = require('http')
var server = http.createServer(app)
var io = require('socket.io')(server)
var GOR = require('./gor')
var path = require('path');
app.use(express.static(path.join(__dirname, '/public')));

//handles get request and serves index.html
app.get('/', function(req, res) {
    res.sendFile(__dirname + '/public/index.html');
});

//wait for server to start
server.listen(8080,()=>{
  console.log("server started");
  setInterval(emit_data,5000);
  emit_data();
  
  //setInterval(GOR.send_from_another_js,5000);
  //GOR.send_from_another_js(io);
})

function emit_data(){
    io.emit( 'update', "webserver.js");
}

从上面的代码中可以看到,我有一个函数,它每5秒向socket发出一次,并且运行良好。我已经确认了它。
我现在要做的就是创建一个单独的. js文件,并将我的所有函数保存在那里,以使代码看起来更简洁。我将另一个.js文件命名为戈尔:
gor.js:

//I want to call this function in my webserver.js and transmit this socket
function send_from_another_js(io){
    console.log("function called");
    io.emit( 'update', "another_js");
}

module.exports = {
    send_from_another_js    
}

当我在server.js中调用此函数时,它不起作用:

server.listen(8080,()=>{
  console.log("server started");
  setInterval(GOR.send_from_another_js,5000);
  GOR.send_from_another_js(io);

})

在其他.js文件中使用相同的.io的正确方法是什么?以上方法不起作用。

编辑1

在my .html中,我等待socket上的消息:

window.addEventListener('DOMContentLoaded', () => {
    
    socket.on('update', function(number_to_set) {
    console.log("socket update received");
    document.getElementById('number1').innerHTML = number_to_set;

});
    
    var button = document.getElementById("operation_code_button");
    button.addEventListener("click", function(event){
    var val = document.getElementById("operation_code_input").value;
    console.log("socket clicked, emmiting data");
    socket.emit('button_click',val);
    
});

})

在我的.js文件中,我每5秒向这个套接字发出一次:

server.listen(8080,()=>{
    console.log("server started");
    setInterval(emit_data,5000);
    emit_data();
})

5秒钟后,我可以看到我的网页更新数据,所以一切工作!!!
我想在另一个.js文件中声明emit_data函数,并在我的主.js文件中使用它。
我的辅助.js文件(戈尔.js)中的函数:

function send_from_another_js_1(io){
  io.emit( 'update', data);
}

我想在main.js中调用它,就像调用emit_data一样

j5fpnvbx

j5fpnvbx1#

您需要等待服务器初始化。您在www.example.com准备好之前调用了您的函数socket.io。这就是为什么io.emit函数是“未定义的”。

server.listen(8080,()=>{
  GOR.send_from_another_js(io);
})
vxf3dgd4

vxf3dgd42#

编辑:(3)相信它就是你要找的...
“服务器.js”

const content = require('fs').readFileSync(__dirname + '/index.html', 'utf8');
const httpServer = require('http').createServer((req, res) => {
// serve the index.html file
res.setHeader('Content-Type', 'text/html');
res.setHeader('Content-Length', Buffer.byteLength(content));
res.end(content);
});

const io = require('socket.io')(httpServer);

const apple = require("./File2.js")
apple.send_from_another_js_1(io);
apple.send_from_another_js_2(io);

var port = 3000; //wamp server
var prompt = 'Open browser at http://localhost:'
httpServer.listen(port, () => {
console.log(prompt, port);
});

“文件2.js”

function send_from_another_js_1(io){
  io.on('connection', function (socket) {
  socket.on('file2_1_EventTrigged', function (data) {
  socket.emit('update1', "send_from_another_js_1(io) : "+ data);
  console.log("+++ function send_from_another_js_1(io) called");
  });
 });
}

function send_from_another_js_2(io){
  io.on('connection', function (socket) {
  socket.on('file2_2_EventTrigged', function (data) {
  socket.emit('update2', "send_from_another_js_2(io) : "+ data);
  console.log("... function send_from_another_js_2(io) called");
  });
 });
}

module.exports = {
 send_from_another_js_1,
 send_from_another_js_2
}

“索引文件”

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="Content-Type" content="text/html">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <meta name="keywords" content="HTML, CSS, JavaScript">
 <meta name="author" content="Dr.Chaiya Tantisukarom">
 <meta http-equiv="Cache-Control" content="public, max-age=31536000">
 <title>NodeJS socket.io</title>
</head>
<body>
 <h1 style="text-align: center;">Hello another world</h1>
 <div style="text-align: center;">
  <span>
   <button onclick="file2_1()">file2_1</button>
  </span>
  <span>
   <button onclick="file2_2()">file2_2</button>
  </span>
 </div>

<script src="/socket.io/socket.io.js"></script>
<script>
 var socket = io();
 socket.on('connect',()=>{
  //alert('Connected');
 })

function file2_1(){
 socket.emit('file2_1_EventTrigged', "Hello file2_1, how are you today?");
}
socket.on('update1', (data)=>{
 alert(data);
})

function file2_2(){
 socket.emit('file2_2_EventTrigged', "Hi file2_2, trust you are ok.");
}
socket.on('update2', (data)=>{
 alert(data);
})

</script>
</body>
</html>

干杯!

zysjyyx4

zysjyyx43#

当您调用此函数时:

server.listen(8080,()=>{
    console.log("server started");
    setInterval(GOR.send_from_another_js,5000);
    GOR.send_from_another_js(io);
})

setInterval()没有为GOR.send_from_another_js()提供参数,因此io变为undefined。
为了解决这个问题,我将在setInterval()调用中使用第二个lambda表达式。

server.listen(8080, () => {
    console.log("server started");
    setInterval(() => {
        GOR.send_from_another_js(io);
    }, 5000);
    GOR.send_from_another_js(io);
});

相关问题