【问题标题】:Socket.io is not working with my node/express applicationSocket.io 不适用于我的 node/express 应用程序
【发布时间】:2015-04-21 13:43:18
【问题描述】:

我将 openshift 与 express 一起使用,无论我将 socket.io 更改为何种配置,它都会破坏我的应用程序。我错过了什么?

我已经注释掉了使用 socket.io 的部分并且应用程序运行良好。 当我取消注释 socket.io 时,一切都出错了。我尝试更改代码的位置以接受标准 io.listen(app),但它仍然中断。我也尝试了很多来自互联网的例子。

这可能吗? //self.io.listen(self.app);如果不是,我应该让 socket.io 在我的应用程序的上下文中听什么?我无法调用 io.listen(server)..

var express = require('express');
//etc

// configuration     
mongoose.connect(configDB.url); // connect to our database
require('./config/passport')(passport); 

var App = function(){

 // Scope
 var self = this;

 // Setup
 self.dbServer = new      mongodb.Server(process.env.OPENSHIFT_MONGODB_DB_HOST,parseInt(process.env.O PENSHIFT_MONGODB_DB_PORT));
 self.db = new mongodb.Db(process.env.OPENSHIFT_APP_NAME,    self.dbServer, {auto_reconnect: true});
 self.dbUser = process.env.OPENSHIFT_MONGODB_DB_USERNAME;
 self.dbPass = process.env.OPENSHIFT_MONGODB_DB_PASSWORD;

 self.ipaddr  = process.env.OPENSHIFT_NODEJS_IP;
 self.port    = parseInt(process.env.OPENSHIFT_NODEJS_PORT) || 8080;
 if (typeof self.ipaddr === "undefined") {
  console.warn('No OPENSHIFT_NODEJS_IP environment variable');
 };

 // Web app urls
 self.app  = express();


 //self.io  = require('socket.io');
 //self.clients = [];

 /*self.io.sockets.on('connection', function (socket) {
      self.clients.push(socket);

      socket.emit('welcome', { message: 'Welcome!' });

      // When socket disconnects, remove it from the list:
      socket.on('disconnect', function() {
          var index = self.clients.indexOf(socket);
          if (index != -1) {
              self.clients.splice(index, 1);
          }
      });

  });*/



  // set up our express application
  self.app.use(morgan('dev')); // log every request to the console
  self.app.use(cookieParser()); // read cookies (needed for auth)
  self.app.use(bodyParser.json()); // get information from html forms
  self.app.use(bodyParser.urlencoded({ extended: true }));
  self.app.use(bodyParser());
  self.app.use(multer({ dest: process.env.OPENSHIFT_DATA_DIR}));
  self.app.use(compression());
  self.app.use(express.static(__dirname + '/public'));
  self.app.use("/public2",    express.static(process.env.OPENSHIFT_DATA_DIR));
  self.app.set('view engine', 'ejs'); // set up ejs for templating
  self.app.use(function (req, res, next) {
      res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
      res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
      res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
      res.setHeader('Access-Control-Allow-Credentials', 'true');
      next();

  }
 );

  // required for passport
  self.app.use(session({
secret:'example',
   maxAge: 6 * 3 * 60 * 1000,
   store:  new MongoStore({ url: process.env.OPENSHIFT_MONGODB_DB_URL,
   clear_interval: 6 * 3 * 60 * 1000 })
  }));

  self.app.use(passport.initialize());
  self.app.use(passport.session()); // persistent login sessions
  self.app.use(flash()); // use connect-flash for flash messages stored in session

 require('./app/routes.js')(self.app, passport); // load our routes and    pass in our app and fully configured passport

 self.connectDb = function(callback){
  self.db.open(function(err, db){
  if(err){ throw err };
  self.db.authenticate(self.dbUser, self.dbPass, {authdb: "admin"},    function(err, res){
    if(err){ throw err };
    callback();
   });
  });
 };


 //starting the nodejs server with express
 self.startServer = function(){
 self.app.listen(self.port, self.ipaddr, function(){
  console.log('%s: Node server started on %s:%d ...', Date(Date.now()),   self.ipaddr, self.port);
   });

  //websockets
   //self.io.listen(self.app);

 };

 // Destructors
 self.terminator = function(sig) {
  if (typeof sig === "string") {
    console.log('%s: Received %s - terminating Node server ...',    Date(Date.now()), sig);
   process.exit(1);
   };
  console.log('%s: Node server stopped.', Date(Date.now()) );
 };

 process.on('exit', function() { self.terminator(); });

 self.terminatorSetup = function(element, index, array) {
  process.on(element, function() { self.terminator(element); });
 };

 ['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT', 'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGPIPE', 'SIGTERM'].forEach(self.terminatorSetup);

};

 //make a new express app
 var app = new App();

 //call the connectDb function and pass in the start server command
 app.connectDb(app.startServer);

【问题讨论】:

  • 你试过 self.io = require('socket.io')(self.app); per docs
  • 我试过了,它不起作用..我将尝试在我的路由文件中启动它..类似于var io = require('socket.io').listen(8000);
  • 不调用别的? (即如果你这样做,self.io.listen 应该是不必要的)
  • var app = express(); var server = http.createServer(app); var io = require('socket.io').listen(server); - 尝试监听服务器,而不是应用程序。您可以查看示例here

标签: javascript node.js express socket.io openshift


【解决方案1】:

感谢您的 cmets。解决方案是创建一个 self.server 变量以将 express 服务器传递到 socket.io。我已经测试了连接,现在工作正常;与所有其他服务器依赖项。

   //starting the nodejs server with express

  self.startServer = function(){
  self.server = self.app.listen(self.port, self.ipaddr, function(){
  console.log('%s: Node server started on %s:%d ...', Date(Date.now()),     self.ipaddr, self.port);
 });

  //websockets
  self.io  = require('socket.io').listen(self.server);

  };

【讨论】:

    猜你喜欢
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2012-02-25
    相关资源
    最近更新 更多