Если есть только одно устройство, которое вы хотите общаться и он уже должен быть подключен к серверу и req.app.get('sock')
, как вы получите доступ к объекту socketio
сервера, то вы можете сделать это следующим образом:
var theDeviceSocket;
req.app.get('sock').on('connection', function(socket) {
theDeviceSocket = socket;
});
router.post('/example', function(req, res, next) {
if (theDeviceSocket) {
theDeviceSocket.emit("someMsg", "someData");
}
// send whatever response you want to send
res.end();
});
Если вы пытались получить ответ от одного устройства и возврата, что в ответ на POST, то вы могли так что-то вроде этого:
// store the one connection to/from the special device
var theDeviceSocket;
// keep a request cntr so we can tell which response goes with which request
var requestCntr = 0;
req.app.get('sock').on('connection', function(socket) {
theDeviceSocket = socket;
});
router.post('/example', function(req, res, next) {
var timer, thisRequestId;
function gotData(data) {
// if this is our specific response
if (data.requestId === thisRequestId) {
theDeviceSocket.removeListener("someMsgResponse", gotData);
res.send(data);
clearTimeout(timer);
}
}
if (theDeviceSocket) {
theDeviceSocket.on("someMsgResponse", gotData);
thisRequestId = requestCntr++;
theDeviceSocket.emit("someMsg", {requestId: thisRequestId});
// set up a timeout in case we don't get the proper response
timer = setTimeout(function() {
theDeviceSocket.removeListener("someMsgResponse", gotData);
res.send("error");
}, 5000);
}
});
Эта вторая схема осложняется тем фактом, что вы создали ее как схему запроса/ответа, но socket.io не является протоколом запроса/ответа. Таким образом, чтобы узнать, какой ответ относится к какому запросу (когда есть потенциально несколько клиентов, взаимодействующих с сервером в одно и то же время), вы должны реализовать какой-то запрос в данных, которые вы отправляете и получаете через socket.io. Это означает, что вам нужно изменить устройство, чтобы повторить запрос, если вы отправили его с его ответом. Все это не было бы необходимо, если бы вы использовали протокол, предназначенный для запроса/ответа, такого как HTTP, а не socket.io.
Во-первых, на самом деле нет смысла помещать этот код внутри обработчика маршрута. Обработчик маршрута - это то, что срабатывает, когда какой-либо один клиент попадает в маршрут. Ваши слушатели socket.io должны применяться ко всем клиентам и не зависят от поведения одного клиента. Если вы можете создать резервную копию и описать проблему с более высоким уровнем, которую вы действительно пытаетесь решить здесь, мы можем предложить гораздо лучший подход. – jfriend00
Я пытаюсь создать схему: запрос отправки клиента через http (мой почтовый маршрут), затем сервер отправляет запрос сокета на какое-то устройство, затем сервер получает данные с устройства и отправляет любой результат клиенту через http. –
Извините, я до сих пор не понимаю, что вы пытаетесь сделать. В HTTP-запросе вы обычно просто возвращаете результаты этого запроса в ответ на HTTP-запрос. Почему соединение socket.io связано с HTTP-запросом вообще? Вы все еще не объяснили, почему вам нужно что-то делать с socket.io в этом конкретном запросе HTTP. – jfriend00