Socket.io 页面永远加载

时间:2021-02-07 15:37:31

标签: javascript node.js sockets socket.io pug

注意 - 我使用 Pug 来呈现我的页面。

我的页面在包含 script(src="/socket.io/socket.io.js") 时不会停止加载。

这是我的 app.js 中的相关内容。

const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);

所有软件包均已正确安装。

在我的头标签中:

  script(src="/socket.io/socket.io.js")
  script.
    var socket = io();

然而,我的页面并没有停止加载。我在这里做错了什么?

更新:

app.js

const path = require('path');
const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');

const AppError = require('./utils/appError');
const globalErrorHandler = require('./controllers/errorController');
const userRouter = require('./routes/userRoutes');
const viewRouter = require('./routes/viewRoutes');
const projectRouter = require('./routes/projectRoutes');

const app = express();

app.set('view engine', 'pug')
app.set('views', path.join(__dirname, 'views'));

//MIDDLEWARES
if (process.env.NODE_ENV === 'development') {
  app.use(morgan('dev'));
}

app.use(express.urlencoded({extended: true}));
app.use(express.json());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use((req, res, next) => {
  req.requestTime = new Date().toISOString();
  next();
});

app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, 'overview'));
})

//ROUTES
app.use('/', viewRouter);
app.use('/api/1/users', userRouter);
app.use('/api/1/projects', projectRouter)

app.all('*', (req, res, next) => {
  next(new AppError(`Can't find ${req.originalUrl}.`, 404));
});

app.use(globalErrorHandler);

module.exports = app;

server.js(由节点运行)

const mongoose = require('mongoose');
const dotenv = require('dotenv');

// mongoose.set('debug',true);
dotenv.config({path: './config.env'})
const app = require('./app');

const DB = process.env.DB.replace('<PASSWORD>', process.env.DBPASS);

mongoose.connect(DB, {
    useNewUrlParser: true,
    useCreateIndex: true,
    useFindAndModify: false,
    useUnifiedTopology: true
}).then(con => {console.log('? Connected.')})


const port = process.env.PORT || 3000;
app.listen(port, () => {
    console.log(`? Running on ${port}.`)
});

const http = require('http').Server(app);
const io = require('socket.io')(http);

io.on('connection', socket => {
  socket.on('greeting', msg => {
      console.log(msg);
  })
});

http.listen(80);

1 个答案:

答案 0 :(得分:0)

既然你已经展示了你的代码,这部分是错误的:

const port = process.env.PORT || 3000;
app.listen(port, () => {
    console.log(`? Running on ${port}.`)
});

const http = require('http').Server(app);
const io = require('socket.io')(http);

您正在那里创建两个独立的服务器,并将 socket.io 绑定到未运行的服务器。把上面的代码改成这样:

const port = process.env.PORT || 3000;
const server = app.listen(port, () => {
    console.log(`? Running on ${port}.`)
});

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

在 OP 展示其实际代码之前尝试提供帮助。

我的猜测是您的环境中出现了某些问题,或者您的操作系统中存在某些问题,或者某些东西正在阻止某些请求。为了排除或排除某些事情,我建议您尝试使用这个简单的应用程序,它对我来说很好用:

// app.js
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const path = require('path');

app.get("/", (req, res) => {
    res.sendFile(path.join(__dirname, "temp.html"));
});

io.on('connection', socket => {
    socket.on("greeting", msg => {
        console.log(msg);
    });
});

server.listen(80);

和 HTML 文件 temp.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="/socket.io/socket.io.js"></script>
    <style>
    </style>
</head>
<body>
<button id="myButton">Press Me</button>

<script>
const socket = io();
document.getElementById("myButton").addEventListener("click", () => {
    socket.emit("greeting", "hi from client");
});
</script>

</body>
</html>

您将这两个文件放在同一个项目中,并且在该项目中安装了服务器端 socket.io 库(按照正常安装,它应该在 node_modules 中)。

使用 node app.js 以具有服务器控制台的方式启动服务器,您可以从中看到输出。然后,从同一台计算机上的浏览器转到 http://localhost。它应该加载一个带有单个按钮的网页。按下那个按钮。每次按下该按钮时,您都会在服务器控制台中看到一条消息,显示 hi from client

如果这有效,那么我们需要查看您的所有项目代码,以了解您的实际项目有什么问题。

如果这不起作用,那么我们需要知道您遇到了什么错误。您可以尝试将此项目移动到其他端口,以防您在特定端口上阻塞某些内容。如果网络或文件系统中的某些内容被卡住,您可以重新启动计算机。