【问题标题】:socket.io & express: 404 not foundsocket.io & express: 404 未找到
【发布时间】:2017-09-27 03:29:29
【问题描述】:

我的 app.js

const express = require('express'),
      morgan = require('morgan'),
      bodyParser = require('body-parser'),
      path = require('path'),
      mongoose = require('mongoose'),
      app = express(),
      config = require('./config'),
      Note = require('./models/note'),
      server = require('http').createServer(app),
      io = require('socket.io')(server),
      socket = io.socket;

mongoose.connect('mongodb://'+config.db.host+'/'+config.db.name);

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// Serve static assets
app.use(express.static(path.resolve(__dirname, '..', 'build')));

app.use(function(req, res, next) {
  const allowedOrigins = [
    'http://127.0.0.1:8000',  
    'http://localhost:8000',  
    'http://127.0.0.1:3000',  
    'http://localhost:3000'];
  const origin = req.headers.origin;
  if(allowedOrigins.indexOf(origin) > -1){
    res.setHeader('Access-Control-Allow-Origin', origin);
  }
  //res.header("Access-Control-Allow-Origin", "127.0.0.1 localhost");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  res.header('Access-Control-Allow-Credentials', true);
  next();
});

在上述代码之后的处理程序中调用socket.emit()

我的 index.js

'use strict';

const app = require('./app'),
      // server = http.createServer(app),
      PORT = process.env.PORT || 8000;

app.listen(PORT, () => {
  console.log(`REST API running on ${PORT}!`);
});

控制台输出:

有什么想法吗?谢谢

【问题讨论】:

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


    【解决方案1】:

    如果你要这样做:

    server = require('http').createServer(app),
    

    那么,你不能这样做:

    app.listen(PORT, ...);
    

    因为app.listen() 将创建一个新的不同的服务器,而 socket.io 不会与那个服务器关联。

    相反,您需要这样做:

    server.listen(PORT, ...)
    

    使用 app.js 中的 server 值。而且,如果你想从 app.js 在服务器中require(),你还需要从 app.js 中导出它(我看不到你的代码在做什么)。


    作为参考,the code for app.listen(),这样做:

    app.listen = function listen() {
      var server = http.createServer(this);
      return server.listen.apply(server, arguments);
    };
    

    您可以看到它如何创建与您传递给 socket.io 的服务器不同的服务器。因此,您传递给 socket.io 的那个永远不会启动,因此 socket.io 不起作用。

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 2018-09-10
      • 2014-10-20
      • 2015-10-10
      • 2014-01-16
      相关资源
      最近更新 更多