2015-11-12 2 views
0

J'ai construit une application de chat en ligne en utilisant NodeJS, Express, et Socket.IO - tourne bien localement, mais ne peux pas le faire fonctionner sur le serveur. Je cours Windows 2012/IIS 8.5/IISNode. Mon site ne fonctionne pas en mode virtuel, il s'exécute en tant qu'application dans ce format: http://[domainname]/subfolder/chatserver.js. Lorsque j'exécute l'application, j'ai une configuration de routage, donc si vous allez à '/', elle sert une fenêtre de discussion html régulière. Si vous allez à une deuxième URL, il sert une fenêtre de chat d'administration. Les deux fenêtres doivent se connecter au serveur afin d'envoyer des messages, mais je ne peux pas le faire pour se connecter.NodeJS Socket.IO Wont Connect

Je fais référence au client socketio comme ceci:

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.7/socket.io.min.js"> </script> 

Quand je lance localement, je ne fait avoir à lui comme cette référence, je peux le faire à la place

<script src="socket.io/socket.io.js"></script> 

Cette façon, si je comprends bien, il devrait télécharger le script du serveur. Cependant, je reçois 404, peu importe ce que j'essaie d'utiliser cette méthode.

Dans le code client, j'exécute cet appel: socket = io.connect (adresse, détails); console.log (socket); Après la méthode connect, le paramètre socket.connected est défini sur false. Est-ce que quelqu'un sait s'il ne se connecte pas parce que je télécharge le js d'un emplacement différent de celui de l'application nodejs qui tourne sur le serveur?

Ma deuxième question est la suivante: pourquoi ne pourrais-je pas référencer correctement le script et le télécharger automatiquement? Est-ce parce que je cours en tant qu'application, pas en tant que virtuel? Je dois être capable de fonctionner en tant qu'application afin que je puisse utiliser le nom de domaine.

Toute aide serait appréciée, j'ai travaillé à ce problème pendant 4 jours maintenant! :(

Voici mon fichier web.config:

<configuration> 
    <system.webServer> 

    <!-- indicates that the server-faye.js and server-socketio.js files are node.js applications 
    to be handled by the iisnode module --> 

    <handlers> 
     <add name="iisnode" path="chatserver.js" verb="*" modules="iisnode" /> 
    </handlers> 

    <!-- indicate that all strafic the URL paths beginning with 'socket.io' should be 
    redirected to the server-socketio.js node.js application to avoid IIS attempting to 
    serve that content using other handlers (e.g. static file handlers) 
    --> 

    <rewrite> 
     <rules> 
       <rule name="LogFile" patternSyntax="ECMAScript"> 
        <match url="socket.io" /> 
        <action type="Rewrite" url="chatserver.js" /> 
       </rule> 
     </rules> 
    </rewrite>  

    <!-- disable the IIS websocket module to allow node.js to provide its own 
    WebSocket implementation --> 
    <webSocket enabled="false" /> 

    </system.webServer> 
</configuration> 

Voici le code du serveur.

var app = require('express')(); 
var httpServer = require('http').Server(app); 
var io = require('socket.io')(httpServer); 

var port = process.env.PORT || 3000; 

app.get('/', function (req, res) { 
    res.sendFile(__dirname + '/chat-index.html'); 
}); 

app.get('/chat-admin', function (req, res) { 
    res.sendFile(__dirname + '/chat-admin.html'); 
}); 

httpServer.listen(port, function() { 
    console.log('listening on port: ' + port); 
}); 

// Fires when a client connects to the server 
io.sockets.on('connection', function (socket) { 
    console.log('a user connected'); 
}); 

Comme vous pouvez le voir est très basique Quand je frappe l'url, je deux messages: le premier dit qu'il écoute sur un port et le second dit un utilisateur connecté, localement je reçois les deux ... Sur le serveur, je reçois l'écoute sur un message de port

Voici le code client:

<!doctype html> 
<html> 
<head> 
    <title>Chat</title> 
</head> 
<body class="chat-body"> 

    <script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> 
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script> 

    <script type="text/javascript"> 
     var socket 

     $(document).ready(function() { 
      // Connect to the chat server 
      socket = io(); 
      console.log(socket.connected); 
     }); 
    </script> 

</body> 
</html> 

Répondre

0

Cette balise de script (notez la principale barre oblique légèrement différente de ce que vous avez):

<script src="/socket.io/socket.io.js"></script> 

fonctionnera si vous avez un serveur web qui servira jusqu'à socket.io.js lorsqu'il reçoit une demande de cette chemin.

Si vous exécutez node.js côté serveur et que vous initialisez la bibliothèque socket.io correctement sur node.js et que vous avez installé socket.io correctement sur le serveur, alors socket.io interceptera cette requête ci-dessus et servira socket.io.js retour au navigateur. Puisque vous obtenez un 404, vous n'avez apparemment pas configuré correctement. Puisque vous n'avez fourni aucun de vos nœuds.js code, nous ne pouvons pas vraiment conseiller plus spécifiquement.

+0

J'ai finalement réduit un peu cela. Je configure l'exemple dante en tant que virtuel dans IIS. J'ai ensuite mis en place un site appelé dante.com pointé vers le même dossier que le virtuel et ajouté une entrée d'hôte. Le dossier virtuel fonctionne, le site ne marche pas. Le diff est quand je frappe l'URL du dossier virtuel, il fait cet appel: http: //localhost/dante/socket.io/socket.io.js qui renvoie le js. Appeler dante.com fait le même appel comme: http://dante.com/socket.io/socket.io.js et retourne le client.html, pas le js. La réécriture doit être ce qui cause le problème d'une manière ou d'une autre mais je ne peux pas voir quelque chose de mal avec ça. – Randy