首页 > 解决方案 > 将 socket.io 与快速路由器一起使用

问题描述

我对 node.js 相当陌生,我正在尝试构建一个网络聊天,到目前为止,我有一个 server.js 文件和一个 router.js 文件,其中应该包含我的所有路由。我没有使用快速生成器。我想使用 socket.io,但在我当前的设置中它不起作用。这是我所拥有的

服务器.js

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


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

const middleware = [
    layout(),
    express.static(path.join(__dirname, 'public')),
    bodyParser.urlencoded(),


];

app.use(middleware);

app.use('/', routes);

app.use((req, res, next) => {
    res.status(404).send("Sorry can't find that!");
});

app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Something broke!');
});

io.on('connection',function (socket) {
    console.log('yo');
});




server.listen(3000, () => {
    console.log(`App running at http://localhost:3000`);
});

路由器.js

const express = require('express');
const router = express.Router();
const {check, validationResult}=require('express-validator');
const { matchedData } = require('express-validator/filter')
const app = express();


    router.get('/', (req, res) => {
        res.render('index', {
            data: {},
            errors: {}
        })
    });

    router.post('/enter', [
        check('username')
            .isLength({min: 1})
            .withMessage('Username is required')   //implement personalized check
    ], (req, res) => {
        const errors = validationResult(req);

        if (!errors.isEmpty()) {
            return res.render('index', {
                data: req.body,
                errors: errors.mapped()
            })
        }
        const data = matchedData(req)

    });



module.exports = router;

它应该在控制台上记录“yo”,但它没有。我已经尝试将 socket.io 设置部分移动到 router.js,它没有给出任何错误,但它没有记录任何内容。另外,如果我在 server.js 上正确设置了 socket.io,如何将它传递给 router.js?

编辑 index.ejs 文件有一些客户端代码初始化与 socket.io 的连接

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Global.io</title>

    <link type="text/css" rel="stylesheet" href="/index.css">
    <script>
        var socket = io();


        socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
            console.log('yo client');
        });
    </script>
  <!--  <script src="/socket.io/socket.io.js"></script>
    <script src="https://code.jquery.com/jquery-1.11.1.js"></script>

    <script src="/scripts/client.js" defer></script> -->

</head>
<body>
<h1>Start debating about the change</h1>
<div id="wrapper">

    <form id="formElem" method="post" action="/enter" novalidate>
        <% if (errors.username) { %>
            <div class="error"><%= errors.username.msg %></div>
        <% } %>
        <input id='name' type="text" name="user" placeholder="User name" class=" <%= errors.username ? 'form-field-invalid' : ''%>">
        <select name="room" id="room">
        </select>
        <button type="submit" id="submit-b">Submit</button>
    </form>



</div>

</body>
</html>

现在它给出一个错误,说 io 未定义。

标签: javascriptnode.jsexpresssocket.io

解决方案


You need this:

<script src="/socket.io/socket.io.js"></script>

Before the script that tries to use socket.io in your web page. That script loads the socket.io library and defines the io symbol so you can then use it after the library has been loaded.


推荐阅读