Javascript 将socket.io与express router一起使用
我是node.js的新手,我正在尝试构建一个webchat,到目前为止,我有一个server.js文件和一个router.js文件,其中应该包含我的所有路由。我没有使用快速生成器。我想使用socket.io,但在我当前的设置中它不起作用。 这是我的 server.jsJavascript 将socket.io与express router一起使用,javascript,node.js,express,socket.io,Javascript,Node.js,Express,Socket.io,我是node.js的新手,我正在尝试构建一个webchat,到目前为止,我有一个server.js文件和一个router.js文件,其中应该包含我的所有路由。我没有使用快速生成器。我想使用socket.io,但在我当前的设置中它不起作用。 这是我的 server.js const path = require('path'); const express = require('express'); const layout = require('express-layout'); const a
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`);
});
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;
router.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`);
});
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>
Global.io
var socket=io();
on('connect',function(){//TIP:您可以避免侦听'connect',也可以直接侦听事件!
console.log('yo client');
});
开始讨论这个变化
提交
现在,它给出一个错误,表示io未定义。您需要:
<script src="/socket.io/socket.io.js"></script>
在尝试在网页中使用socket.io的脚本之前。该脚本加载socket.io库并定义
io
符号,以便您可以在加载库后使用它。是否有启动socket.io连接的客户端socket.io代码?使用客户端代码编辑问题在尝试加载客户端socket.io库之前,不显示加载客户端socket.io库的脚本标记使用它。