2017-06-29 2 views
0

Ich versuche, meinen Knotenserver einzurichten, um alle verbundenen Clients mit neuen Informationen in Echtzeit zu aktualisieren. Wenn ich den unten stehenden Code ausführe, wird der Rückruf io.sockets.on('connection') ständig ausgelöst, überflutet die Konsole mit der Nachricht Client connected!, und das Front-End wird nicht von socket.emit() aktualisiert. Was mache ich falsch?socket.io funktioniert nicht mit Knotenserver

app.js

var express = require('express'); 
var path = require('path'); 
var favicon = require('static-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var mongoose = require('mongoose'); 
var models = require('./models.js'); 

var routes = require('./routes/index'); 
var users = require('./routes/users'); 

var app = express(); 

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

app.use(favicon()); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded()); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', routes); 
app.use('/users', users); 

/// catch 404 and forwarding 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; 

// Connect to the Mongo database 
mongoose.connect('mongodb://localhost/test'); 

bin/www.js

#!/usr/bin/nodejs 
var debug = require('debug')('my-application'); 
var app = require('../app'); 

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

var io = require('socket.io').listen(app.listen(app.get('port'))); 

io.sockets.on('connection', function(socket) { 
    console.log('Client connected!'); 
    socket.on('message', function(data) { 
    console.log('Sending update!'); 
    socket.emit('update', 'Working!'); 
    }); 
}); 

public/Javascripts/update.js

var socket = io.connect('http://' + document.location.hostname + ':3000/'); 

socket.on('connect', function() { 
    console.log('Socket connected!'); 
    socket.emit('message', 'Message from client'); 
}); 

socket.on('update', function(data) { 
    alert(data); 
}); 

Und wenn ich e nd der npm Prozess beginnt der Client anmelden

http://<ip>:3000/socket.io/?EIO=2&transport=polling&t=1498772846992-691 net::ERR_CONNECTION_REFUSED 

ich Beiträge über den Express-Router gelesen habe mit den Socket-Anfragen durcheinander, aber ich kann nicht scheinen, daran zu arbeiten, egal was ich versuche.

+0

Können Sie den Titel Ihrer Frage aktualisieren, um die iss zu charakterisieren Sie möchten Hilfe, nicht die Werkzeuge, die Sie verwenden? – jfriend00

Antwort

1

Können Sie dieses Setup versuchen?

EDITED:

app.js:

var express = require('express'); 
var app = express(); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'pug'); 
app.get('/', function (req, res) { 
    res.render('index'); 
}); 

module.exports = app; 

bin/www.js:

var app = require('../app'); 
var http = require('http'); 
var server = http.createServer(app); 
server.listen(process.env.PORT || '3000', function() { 
    console.log('server listens on port 3000'); 
}); 
var io = require('socket.io')(http); 
io.listen(server); 

io.on('connection', function(socket) { 
    console.log('Client connected!'); 
    socket.on('message', function (data) { 
     console.log('Sending update!'); 
     socket.emit('update', 'Working!'); 
    }); 
}); 

index.pug (oder Jade, sagen sie Jade veraltet ist):

doctype html 
html 
    body 
    h1 Testing socket.io 
    h3#status not connected 
    br 
    p#update update:&nbsp 

    script(src="/socket.io/socket.io.js") 
    script. 
     var socket = io(); 
     socket.on('connect', function() { 
     document.getElementById("status").innerHTML = "connected"; 
     socket.emit('message', 'Hello!'); 
     }); 
     socket.on('update', function (data) { 
      document.getElementById("update").innerHTML += data; 
     }); 
+0

Es scheint ein bisschen besser, denke ich ... jetzt wird die 'Client connected'-Nachricht genau 6 Mal protokolliert, wenn ein Client tatsächlich verbindet, und ein paar weitere Male zufällig, während Sie warten –

+0

können Sie bitte das aktualisierte Setup testen? – mk12ok

+0

Vielen Dank, es funktioniert! Ich denke, mein Problem war, dass ich 'socket.io' auf der Clientseite mit einem cdn anstelle von'/socket.io/socket.io.js' eingebunden habe. Durch diese Änderung wurde es behoben. –

0

Aufruf app.listen (wo app ist das Ergebnis express() des Aufrufens) gibt eine HTTPServer, die die Socket-Verbindung zur Einrichtung verwendet werden können:

var server = app.listen(port); 
var io = socket(server); 

ohne Ihre Lösung manuell ausgeführt wird, würde ich vermuten, dass, weil Sie Erstelle ein neues HTTPServer, um in den Sockel eingeführt zu werden, es wird irgendwie in eine Schleife gehängt.

+1

Danke für den Vorschlag, aber es hat nicht funktioniert –

+0

In Ihrer 'app' und Ihren 'www' js Dateien erstellen Sie sowohl eine App als auch einen io Server ref. Ich glaube, dass Sie eine Endlosschleife erstellen. Warum beides? –

+0

@jamesemanon Ich entfernte die zusätzlichen Referenzen von app.js (Code im ursprünglichen Beitrag aktualisiert), aber ich bekomme das Gleiche. –

Verwandte Themen