2016-04-24 41 views
0

我基本上試圖重新創建一個簡單的聊天應用程序發佈在socket.io的官方網站上。爲什麼socket.io給我一個404錯誤?

我創建了content.js以下模塊:

var app = require('express'); 
var router = app.Router(); 

    module.exports = function(app, io) { 

     app.get('/profile',function(req, res){ 
      res.render('profile.ejs'); 
     }); 
     io.on('connection', function(socket){ 
      socket.on('chat message', function(msg){ 
       io.emit('chat message', msg); 
      }); 
     }); 
     return router; 
    }; 

我從index.js調用它通過這樣的:

// socket.io 
var server = require('http').Server(app); 
var io  = require('socket.io')(server); 
require('./app/content')(app, io); 

同時運行的應用程序,沒有被髮送和以下錯誤顯示在我的控制檯中:

GET /socket.io/?EIO=3&transport=polling&t=1461512892706-14 404 2.370 ms - 1097 

我該如何解決這個問題?據我所知,它與profile.ejs的位置有關?感謝您一如既往的幫助

這裏是index.js:一個用於啓動服務器

var express   = require('express') 
var path   = require('path'); 
var favicon   = require('serve-favicon'); 
var logger   = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser  = require('body-parser'); 
var passport  = require('passport'); 
var flash   = require('connect-flash'); 
var session   = require('express-session'); 
var routes   = require('./routes/index'); 
var morgan   = require('morgan'); 
var users   = require('./routes/users'); 
var home   = require('./routes/home'); 
var mysql   = require('mysql'); 
var helmet   = require('helmet'); 
var app    = express(); 


// socket.io 
var server = require('http').Server(app); 
var io  = require('socket.io')(server); 


require('./config/passport')(passport); // pass passport for configuration 
app.use(morgan('dev')); // log every request to the console 


app.use(cookieParser()); // read cookies (needed for auth) 
app.use(bodyParser.urlencoded({ 
    extended: true 
})); 
app.use(bodyParser.json()); 


var connection = mysql.createConnection({ 
    host: 'localhost', 
    user: 'root', 
    password: 'mysql', 
    database: 'clearreview' 
}); 
connection.connect(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: false})); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

// security measure against xss attacks 
app.use(helmet.xssFilter()); 
// hide powered by express 
app.use(helmet.hidePoweredBy()); 
// security measure against sniffing 
app.use(helmet.noSniff()); 


app.use('/', routes); 



// required for passport 
app.use(session({ 
    secret: 'vidyapathaisalwaysrunning', 
    resave: true, 
    saveUninitialized: true 
})); // session secret 
app.use(passport.initialize()); 
app.use(passport.session()); // persistent login sessions 
app.use(flash()); // use connect-flash for flash messages stored in session 


// routes ====================================================================== 
//require('./app/cr-auth-routes.js')(app, passport); // load our routes and pass in our app and fully configured passport 
require('./app/cr-auth-routes')(app, passport); 
require('./app/search.js')(app, connection); 
require('./app/content')(app, io); 

// catch 404 and forward to error handler 
app.use(function (req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function (err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function (err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: {} 
    }); 
}); 
module.exports = app; 

WWW文件:

#!/usr/bin/env node 

/** 
* Module dependencies. 
*/ 

var app = require('../app'); 
var debug = require('debug')('clear-review:server'); 
var http = require('http'); 

/** 
* Get port from environment and store in Express. 
*/ 

var port = normalizePort(process.env.PORT || '3000'); 
app.set('port', port); 

/** 
* Create HTTP server. 
*/ 

var server = http.createServer(app); 

/** 
* Listen on provided port, on all network interfaces. 
*/ 

server.listen(port); 
server.on('error', onError); 
server.on('listening', onListening); 

/** 
* Normalize a port into a number, string, or false. 
*/ 

function normalizePort(val) { 
    var port = parseInt(val, 10); 

    if (isNaN(port)) { 
    // named pipe 
    return val; 
    } 

    if (port >= 0) { 
    // port number 
    return port; 
    } 

    return false; 
} 

/** 
* Event listener for HTTP server "error" event. 
*/ 

function onError(error) { 
    if (error.syscall !== 'listen') { 
    throw error; 
    } 

    var bind = typeof port === 'string' 
    ? 'Pipe ' + port 
    : 'Port ' + port; 

    // handle specific listen errors with friendly messages 
    switch (error.code) { 
    case 'EACCES': 
     console.error(bind + ' requires elevated privileges'); 
     process.exit(1); 
     break; 
    case 'EADDRINUSE': 
     console.error(bind + ' is already in use'); 
     process.exit(1); 
     break; 
    default: 
     throw error; 
    } 
} 

/** 
* Event listener for HTTP server "listening" event. 
*/ 

function onListening() { 
    var addr = server.address(); 
    var bind = typeof addr === 'string' 
    ? 'pipe ' + addr 
    : 'port ' + addr.port; 
    debug('Listening on ' + bind); 
} 
+0

請向我們展示'index.js'的其餘部分。我們需要了解你如何定義'app'以及如何啓動你的服務器。另外,當你不使用它們時,擺脫'content.js'中的'router'和'app'變量,它們只是可能造成混淆的一點。 – jfriend00

+0

@ jfriend00感謝您的回覆,我更新了我對帖子的回覆index.js – abedzantout

+0

我沒有看到您實際啓動服務器的位置。 – jfriend00

回答

0

看來,要創建兩個單獨的服務器,一個在您www文件有:

var server = http.createServer(app); 

而且,另一位在index.js有:

var server = require('http').Server(app); 

你永遠首發index.js創建的,就是這樣socket.io連接到所以這就是爲什麼你沒有任何socket.io功能之一。您綁定socket.io的服務器從未啓動。

您正在啓動一個您的www文件,但它沒有連接到它的socket.io文件。

您需要創建一個服務器並且只有一個服務器,並且將其作爲Express和socket.io綁定的服務器。然後,你需要啓動一臺服務器。

+0

你認爲它是一個更好的方法來更新www文件或index.js嗎? – abedzantout

+0

@ Predator44 - 老實說,你目前顯示的模塊佈局看起來太複雜了,無法跟隨你想要做的整體。它在我看來就像'index.js'是建立你的服務器肉的地方,所以這可能是你應該創建它並開始它的地方,但我不覺得我有50,000英尺的視角來看你是什麼試圖全面或甚至真正理解你爲什麼擁有'www'文件。 – jfriend00

+0

我只是刪除www文件,並嘗試更新我的index.js。www是由快速應用程序生成器創建的,從那時起我沒有真正觸及它。 – abedzantout

相關問題