Express.js服务器在使用Socket.io时不响应HTTP请求
我使用express-generator
设置了项目。我添加了两个名为server.js
和socketio.js
的文件,分别获取服务器实例和socket.io实例。这是代码,
server.js
const http = require('http');
// app.js created by express-generator
const app = require('./app');
const server = null;
module.exports = {
get server() {
if (!server)
server = http.createServer(app);
return server;
}
};
socketio.js
const server = require('./server');
const io = null;
module.exports = {
get io () {
if (!io)
io = require('socket.io')(server);
return io;
}
};
当我从socketio.js
创建的bin/www
导入express-generator
时,服务器工作正常。它可以接收来自客户端的请求。
但是随后我从同样由app.js
创建的express-generator
导入了文件,服务器将不会收到任何请求。
这里是app.js
,
const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const passport = require('passport');
const session = require('express-session');
const DBPoller = require('./realtime-db');
const indexRouter = require('./routes/index');
const app = express();
app.use(session({ secret: 'cats' }));
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(
express.urlencoded({
extended: false
})
);
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
done(null, user);
});
app.use('/', indexRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
// realtime db
const { io } = require('./socketio');
io.on('connection', socket => {
console.log('on connected');
});
function emitDBChange() {
io.emit('temp-change', { for: 'everyone' });
}
const poller = new DBPoller();
poller.onChange(db => {
emitDBChange();
});
module.exports = app;
回答如下:您的服务器模块导出具有server
属性的对象。您没有正确导入。您正在将父对象分配给server
变量,而不是获得server
属性。
更改此:
const server = require('./server');
对此:
const server = require('./server').server;
或此:
const {server} = require('./server');
Express.js服务器在使用Socket.io时不响应HTTP请求
我使用express-generator
设置了项目。我添加了两个名为server.js
和socketio.js
的文件,分别获取服务器实例和socket.io实例。这是代码,
server.js
const http = require('http');
// app.js created by express-generator
const app = require('./app');
const server = null;
module.exports = {
get server() {
if (!server)
server = http.createServer(app);
return server;
}
};
socketio.js
const server = require('./server');
const io = null;
module.exports = {
get io () {
if (!io)
io = require('socket.io')(server);
return io;
}
};
当我从socketio.js
创建的bin/www
导入express-generator
时,服务器工作正常。它可以接收来自客户端的请求。
但是随后我从同样由app.js
创建的express-generator
导入了文件,服务器将不会收到任何请求。
这里是app.js
,
const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const passport = require('passport');
const session = require('express-session');
const DBPoller = require('./realtime-db');
const indexRouter = require('./routes/index');
const app = express();
app.use(session({ secret: 'cats' }));
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(
express.urlencoded({
extended: false
})
);
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
done(null, user);
});
app.use('/', indexRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
// realtime db
const { io } = require('./socketio');
io.on('connection', socket => {
console.log('on connected');
});
function emitDBChange() {
io.emit('temp-change', { for: 'everyone' });
}
const poller = new DBPoller();
poller.onChange(db => {
emitDBChange();
});
module.exports = app;
回答如下:您的服务器模块导出具有server
属性的对象。您没有正确导入。您正在将父对象分配给server
变量,而不是获得server
属性。
更改此:
const server = require('./server');
对此:
const server = require('./server').server;
或此:
const {server} = require('./server');