2017-01-28 1 views
0

Мне нужно передать данные только пользователю, запрашивающему его. До сих пор я получаю:node.js с socket.io - как передавать данные ТОЛЬКО пользователю, запрашивающему его (в экспресс-маршруте)?

app.js файл (сервер):

var express = require('express'); 
var app = express(); 

app.set('view engine', 'ejs'); 

app.use(function(req, res, next){ 
    req.io = io; 
    next(); 
}); 

var mainPath = require('./routes/mainPath.js'); 
app.use('/', mainpath); 

port = 8000; 
var io = require('socket.io').listen(app.listen(port)); 

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

mainpath.js файла: [!]

var express = require('express'); 
var app = express(); 
var router = express.Router(); 
var request = require('request'); 

    router.post('/path', function(req, res){ 
request('http://google.com', function (err, resp, content_body){ 
    req.io.emit('socketio emit', {socketioEmit : body}); 
}); 
    }); 

// [!] 

module.exports = router; 

проблема появляется, когда .. запрос, используемый здесь, например (или любые быстрые исполняемые данные), быстрее захватить данные, а затем установить соединение socket.io, и пользователь не получает данные.

io.js файл (клиент):

var socket = io(); 
socket.on('connect', function(){ 
console.log('connected'); 
}); 

socket.on('socketio emit', function(emit){ 
console.log(emit.socketioEmit); 
}); 

mainpath.ejs файл:

<html> 
<head></head> 
<body> 
<div class="form_seo_wrapper"> 
    <form action="/path" method="post"> 
     <input type="text" name="input_name" /> 
     <input type="submit" value="go" /> 
    </form> 
</div> 
</body> 
</html> 

path.ejs файл:

<html> 
<head></head> 
<script src="socket.io.min_v1.7.2.js"></script> 
<body> 
<h1>Output:</h1> 
</body> 
<script src="io.js"></script> 
</html> 

Есть идеи? BTW есть ли возможность не нарушать соединение сокета, когда пользователь вводит от '/' до '/ path'?

ответ

1

В вашем app.js вы можете использовать

global.io = require('socket.io').listen(app.listen(port)); 

вместо

var io = require('socket.io').listen(app.listen(port)); 

и в mainpath.js файл просто использовать это, чтобы испустить:

io.emit('socketio emit', {socketioEmit : data}); 

Вы должны сохраните идентификатор сокета, когда этот клиент попытается подключиться к его userId в некотором хранилище в вызове socket.on ('connection')

вы можете получить, что socketId, когда вы хотите, чтобы испустить данные и испускают данные, как этот

io.sockets.to(socketIdOfUser) 

Одна вещь быстро вы можете сделать, это создать комнату против каждого идентификатора пользователя и испускают данные только в этой комнате. Таким образом, вы не должны управлять сокетов в вашем хранилище

НА НЕ НАРУШЕНИЕ Разъем для подключения ON ROUTE CHANGE Обновите свой вопрос с двигателем шаблона или FrontEnd Framework вы используете и структуры приложения

+0

Благодарим Вас за вход! Я обновил свой вопрос, чтобы вы могли лучше настроить ответ. Я думаю, проблема связана с ** socket ** data - _io.on ('connection', function (socket) _ - Я могу подключаться к маршрутам, но я не могу получить доступ к io.socket ... – webmasternewbie

+0

@webmasternewbie check my обновленный ответ –

+0

Еще раз спасибо за ваш ценный вклад! Я использовал комнаты - socket.join (номер), с идентификатором сокета. Однако, когда я оцениваю данные после _req.io.emit ('socketio emit', {socketioEmit: data}); в файле ** mainpath.js ** иногда сокет-соединение с сервером появляется ПОСЛЕ испускания данных, поэтому пользователь просто не видит данные. Любая идея, как это разрешить?Для того, чтобы не нарушать соединение при изменении маршрута - это cookie (с идентификатором) - хорошее решение, или есть более простой метод? – webmasternewbie

Смежные вопросы