【发布时间】:2016-06-06 02:59:17
【问题描述】:
我需要在没有 CORS 标头的服务器上执行 GET 请求,因此我创建了一个非常简单的节点应用程序,它将为我执行 GET:
var io = require('socket.io')();
var request = require('request');
io.on('connection', function(socket) {
socket.on('get', function(url) {
request(url, function(error, response, body) {
socket.emit('response', body);
});
});
});
在客户端,我将它与一个简单的get 函数一起使用:
var socket = io();
function get(url) {
return new Promise(function(resolve) {
socket.emit('get', url);
socket.once('response', function(data) {
resolve(data);
});
}
}
当我一次请求一个 URL 时,这非常有用:
get('http://some/resource/1');
但是当我同时尝试对不同端点的多个请求时,它们都会返回相同的数据:
get('http://some/resource/1');
get('http://some/resource/2');
get('http://some/resource/3');
在这种情况下,所有 3 个请求都返回了 /resource/1 的数据。我理解这是因为所有 3 个请求都立即添加了 socket.once('response') 回调,并且当返回第一个请求的数据时,为它调用所有 3 个回调。
有没有办法让socket.emit() 和socket.on() 相互配对?我知道我可以为每个发射添加一个唯一 ID 并将其传递回响应,或者在消息本身中使用唯一 ID(类似于 socket.emit('get:a54jk14hf'),但我希望有一个更简单的解决方案)。
【问题讨论】:
标签: javascript node.js websocket socket.io