最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Express.js服务器在使用Socket.io时不响应HTTP请求

IT培训 admin 8浏览 0评论

Express.js服务器在使用Socket.io时不响应HTTP请求

我使用express-generator设置了项目。我添加了两个名为server.jssocketio.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.jssocketio.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');
发布评论

评论列表 (0)

  1. 暂无评论