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>
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