используя socket.io с express роутером - PullRequest
0 голосов
/ 09 февраля 2020

Я довольно новичок в node.js, я пытаюсь создать веб-чат, и пока у меня есть файл. js сервера и файл маршрутизатора. js, в котором должны быть все мои маршруты. Я не использую express -генератор. Я хотел бы использовать 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;

Он должен войти "йо" на консоли, но это не так. Я уже пытался переместить установочную часть socket.io на маршрутизатор. js, он не выдает никаких ошибок, но ничего не регистрирует. Также, если я правильно настроил socket.io на моем сервере. js, как передать его маршрутизатору. js?

EDIT есть index.e js файл, содержащий некоторый клиентский код, который инициализирует соединение с 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 не определено.

1 Ответ

0 голосов
/ 09 февраля 2020

Вам нужно это:

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

Перед сценарием, который пытается использовать socket.io на вашей веб-странице. Этот скрипт загружает библиотеку socket.io и определяет символ io, чтобы вы могли использовать его после загрузки библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...