为什么我使用Socket.IO将NodeJS服务器(Sails)连接到另一个NodeJS服务器(Express4)失败了?

时间:2014-09-09 06:16:21

标签: node.js sockets socket.io sails.js sails.io.js

我正在尝试使用socket.io-client将我的Node.JS(使用Sails.JS编写)应用程序连接到另一个Node.JS服务器(Express4 / Socket.io)。

我的帆船服务app/services/Watcher.js看起来像

var client = require('../../node_modules/sails/node_modules/socket.io/node_modules/socket.io-client');

// callback of the form function(socket)
exports.connect = function(callback) {
  sails.log.debug("will connect socket to", sails.config.watcher.uri, "with Socket.io-client version", client.version);
  var socket = client.connect(sails.config.watcher.uri);
  socket.on('connect', function(){
    sails.log.debug("connected");
    socket.on('disconnect', function(){
      sails.log.debug("Disconnected");
    });
    socket.on('error', function(err){
      sails.log.debug("Could not connect", err);
    });
    callback(socket);
  });
};

这是从config/bootstrap.js调用的,如下所示:

Watcher.connect(function(socket){
  sails.log.debug("Connected watcher to relay with socket", socket);
});

在Express方面,我的服务器relay.js非常简单:

var app = require('express')(),
    http = require('http').Server(app),
    io = require('socket.io').listen(http),
    port = process.env.RELAY_PORT || 8000;

app.get('/', function(req, res) {
  var response = {message: "some response"}; // to be implemented.
  res.json(response);
});

http.listen(port, function () {
  console.log("Relay listening on port " + port);
});

io.sockets.on('connection', function (socket) {
  console.log("Connection opened", socket);
  socket.on('disconnect', function () {
    console.log("Socket disconnected");
  });
});

当我运行node relay时,它会尽职尽责地报告

Relay listening on port 8000

当我sails lift我的其他服务器时,它会尽职尽责地报告

will connect socket to http://localhost:8000 with Socket.io-client version 0.9.16

但我从未见过真正的联系。

如果我将浏览器指向localhost:8000,我会得到我期望的{"message":"some response"} JSON回复。

为什么我的中继服务器不接受来自我的socker.io-client应用程序的连接?

1 个答案:

答案 0 :(得分:1)

这里的问题可能是你试图重复使用 来自Sails内部的socket.io-client。通常,如果您在项目中直接require() - Sails的依赖关系,那么您将走向错误的方向。在这种情况下,socket.io-client会缓存配置和连接,因此您的require无法获得新的副本。

相反,做

npm install socket.io-client@~0.9.16 --save
在您的项目中

并要求

var client = require('socket.io-client');

这将为您提供一个可以使用的套接字客户端的新副本,并避免与Sails核心版本的任何冲突。