Использование сокета io для получения данных в реальном времени не работает - PullRequest
0 голосов
/ 25 января 2019

Я плохо знаком со средним стеком и следовал инструкциям по получению данных в реальном времени. Я пробовал каждый шаг, но ничего из этого не работает, как я могу правильно использовать socket.io? Я предоставил свой код для получения пользователей из mongodb, пожалуйста, исправьте мой код

server.js

var express     = require ('express');
var app         = express();
var server      = require('http').Server(app);
var http        = require('http').Server(app);
var io          = require('socket.io')(http);
var morgan      = require ('morgan');
var mongoose    = require('mongoose');
var appRoutes   = require('./app/routes/api');

app.use(morgan('dev'));
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(express.static(__dirname + '/public'));
app.use('/api',appRoutes);

mongoose.connect('mongodb://localhost:27017/testing', function(err){
    if(err){
        console.log('Not connected' + err);
    } else
    {
        console.log('Connected');
    }
});

Тогда вот часть, где я получаю пользователей из таблицы, я не знаю, как получить данные в режиме реального времени:

api.js

var User = require('../models/user');
const router = express.Router();
router.get('/management', function(req, res) {
        User.find({}, function(err, users) {
                if (!users) {
                    res.json({ success: false, message: 'Users not found' }); 
                } else {
                    res.json({ success: true, users: users,});
                }
        });
    });

userCtrl.js

.controller('managementCtrl', function(User, $scope) {
 function getUsers() { 
        User.getUsers().then(function(data) {
            if (data.data.success) {
                app.users = data.data.users;    
            } else {
                app.errorMsg = data.data.message; 
            }
        });
    }
});

users.html

<tbody>
    <tr ng-repeat="person in management.users">
        <td align="center">{{ person.name }}</td>
        <td align="center">{{ person.email }}</td>
    </tr>
</tbody>

Ответы [ 2 ]

0 голосов
/ 25 января 2019

На сервере - я обычно проверяю соединения:

io.on('connection', function(socket){
    console.log('a user connected');
});

Вам необходимо, чтобы клиент и сервер согласовали какой-то токен для прослушивания сокета.В этом случае я жестко кодирую в '123123123'

var User = require('../models/user');
    const router = express.Router();
    router.get('/management', function(req, res) {
            User.find({}, function(err, users) {
                    if (!users) {
                        io.emit("123123123", { success: false, message: 'Users not found' });
                    } else {
                        io.emit("123123123", { success: true, users: users,});
                    }
            });
        });

В угловых -

var socket = io.connect(<url>); //url from server
socket.on('123123123', function (user) {  
    let user = json.parse(user)        
});
0 голосов
/ 25 января 2019

Прежде всего вам нужно получить сокет с событием connection:

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

чем вам нужно установить «слушателя» на конкретное событие, на которое вы хотите ответить данными

Вместе это будет:

io.on('connect', function(socket){
    socket.on('eventYouGet', function(eventData) {
        User.find({}, function(err, users) {
            if (!users) {
                socket.emit('eventAnswer', {success: false, message: 'Users not found'});
            } else {
                socket.emit('eventAnswer', {success: true, users: users)};
           }
        });
    });
});

Где eventYouGet - событие, которое вы (с точки зрения сервера) ожидаете (что-то вроде запроса в REST); eventAnswer - это событие, которое вы отправляете как ответ (клиенту).

Примечание: socket.emit отправляет событие отправителю и никому другому (один сокет)

...