Socket.io + Express + Node + Angular 通知

6

我有一个应用程序,想要为顾客建立一个排队系统。我正在尝试让当顾客加入队列时,通知店员并让他们知道要立即帮助顾客。

但是,我似乎无法让 Socket IO 与我的前端交流。

这是我的代码,我甚至不能让 Node 将 Socket 视为库。我遵循了三个不同的教程,并尝试了它们所有,但我看不出我的服务器代码有什么问题。

以下是我在服务器上与 Socket.io 相关的操作:

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


io.on('connection', function(socket){

    socket.emit('connection', "Connection created.")
    console.log("Socket.io is GO");

    socket.on('add customer', function(customer){
        console.log("Customer added", customer); 

    })

    socket.on('notification', function(data) {
        console.log("NEW CUSTOMER IN THE QUEUE", data);
    });

});

我似乎无法让它在我的服务器上运行,即使它曾经运行过,在其中没有显示任何我添加的socket.on事件,并且它不会输出console.log。

我做错了什么?有人成功地让Socket与Express和Angular一起使用吗?


你把服务器设置为监听模式了吗? - Aditya_Anand
2个回答

12

看起来你的代码不完整,或者可能没有实现得很好。

我使用angular.js、express和socket.io创建了一个示例,试图复制你的要求。

这是我的服务器,app.js

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

app.use(express.static(__dirname + '/public'));

io.on('connection', function(socket) {
  console.log('new connection');

  socket.on('add-customer', function(customer) {
    io.emit('notification', {
      message: 'new customer',
      customer: customer
    });
  });
});

server.listen(4041, function() {
  console.log('server up and running at 4041 port');
});

然后我创建了一个公共文件夹,其中包含以下文件:

public/index.html

<!doctype>
<html ng-app="sampleApp">
  <head>
  </head>

  <body ng-controller="IndexController">
    <label>Please enter your name: </label>
    <input ng-model="currentCustomer.name"/>
    <button ng-click="join()">Join</button>
    <br/>

    <h1>New Customers: </h1>
    <ul>
      <li ng-repeat="customer in newCustomers">{{customer.name}}</li>
    </ul>

    <script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.1/angular.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.1/angular-route.js"></script>
    <script src="app.js"></script>
  </body>

</html>

public/app.js

var app = angular.module('sampleApp', ['ngRoute']);

app.config(['$routeProvider', function($routeProvider) {
  $routeProvider.when('/', {
    templateUrl: '/index.html'
  });
}]);

app.factory('socket', ['$rootScope', function($rootScope) {
  var socket = io.connect();

  return {
    on: function(eventName, callback){
      socket.on(eventName, callback);
    },
    emit: function(eventName, data) {
      socket.emit(eventName, data);
    }
  };
}]);

app.controller('IndexController', function($scope, socket) {
  $scope.newCustomers = [];
  $scope.currentCustomer = {};

  $scope.join = function() {
    socket.emit('add-customer', $scope.currentCustomer);
  };

  socket.on('notification', function(data) {
    $scope.$apply(function () {
      $scope.newCustomers.push(data.customer);
    });
  });
});

这让我更接近工作了。现在我可以确定我的套接字连接正在尝试从Angular到我的服务器,但我的服务器没有看到连接,并且没有触发我放置的任何console.logs。 - Dylan Lott
1
是的,你想看哪些部分呢?我创建了一个套接字工厂,在我的CustomerCtrl中调用它,将addCustomer函数与一个按钮链接起来,并将其发送回我的服务器。`io.on('connection', function(socket) { console.log('新连接', socket); socket.on('addCustomer', function(customer) { io.emit('notification', { message: '新客户', customer: customer }); }); });server.listen(4041, function() { console.log('Socket.IO服务器在端口4040上运行'); });`这是我的服务器代码。其余部分基本上就是你之前有的。 - Dylan Lott
1
这里有一个要点,其中包含与我的通知相关的所有代码。我仍然无法让服务器侦听客户端。 我相信我已经让客户端发射了正确的数据,因为它告诉我找不到服务器。这是 gist - https://gist.github.com/dylanlott/756af5395df5e762c4c8 - Dylan Lott
谢谢,这帮了很多的忙! - Dylan Lott
@DylanLott 没问题! - Wilson
显示剩余5条评论

1
你需要设置socket.io服务器以便监听特定端口。没有监听,它无法监视客户端的连接和发送消息。为了解决这个问题,你应该更改你的代码如下所示:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

//Existing Code

server.listen(1337, function(){
    console.log('listening on *:1337');
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接