如何使用node.js向另一个附加音频文件的域发送请求?

时间:2012-01-10 18:24:08

标签: javascript node.js cross-domain

这是我想要实现的流程:

1)用户将音频文件上传到server1
2)Server1接收该音频文件并将其发送到不同域的server2 3)Server2将音频文件转换为文本
4)Server2用文本
响应server1 5)Server1向用户显示文本

完成了server2上的语音到文本转换。我被困在发送音频文件并等待响应。我知道如何使用GET发送请求,但我认为我不能将它用于音频文件。

如何使用node.js将音频文件发送到其他服务器?

我对node.js很新,所以任何帮助都会受到赞赏。感谢。

更新:
Server2使用REST API并期望文件被POST。

2 个答案:

答案 0 :(得分:2)

这完全取决于远程服务器期望接收音频文件的方式。假设它有某种RESTful Web服务接口,文件内容被POST到某个URL,你可能会做这样的事情:

fs.readFile('/path/to/my/audiofile.wav', function (err, data) {
  if (err) throw err;
  var options = {
    host: 'remotehost.com',
    path: '/upload/wav',
    method: 'POST',
    headers: { 'Content-Type': 'audio/wav' }
  };
  var req = http.request(options, function(res) {
    // Handle a successful response here...
  });
  req.on('error', function(e) {
    // Handle an error response here...
  });
  // Write the audio data in the request body.
  req.write(data);
  req.end();
});

同样,它完全取决于服务器希望您发送数据的方式。它可能期望完全不同的协议(或方法或路径),身份验证,编码或任何数量的细节,这将彻底改变我的样本答案的可行性。

答案 1 :(得分:0)

这是一个很好的消息传递用例。我建议像这样的流程:

  • 用户将文件从浏览器发布到服务器A.
  • 服务器A存储文件。
  • 服务器A创建一个作业,将文件转换为文本并将其发送到作业队列。作业包含文件的位置。
  • 服务器A创建一个频道(例如PubNub或Pusher)。
  • 服务器A将频道ID返回给浏览器。
  • 服务器B实际上是一个监听队列的池(可以是很多工作人员)。
  • 池工作人员将作业从队列中拉出并处理它。
  • 池工作者保存文本文件。
  • 池工作人员向包含文本文件位置和/或正文的频道ID发送消息。
  • 浏览器获取消息通知并将其显示给用户

服务器A和服务器B之间的直接HTTP通信的一些弱点是:

  • 服务器A和服务器B的API与端点之间的紧密耦合。
  • 如何授予服务器A和服务器B相互通信的权限?
  • 如果服务器B需要暂停一段时间会发生什么?使用消息队列,作业将累积,直到服务器B备份,然后恢复。通过HTTP通信,在服务器B恢复之前会出现故障。
  • 如果您需要添加更多服务器B,该怎么办?现在你正在搞乱HTTP反向代理,负载平衡等等,而你的服务器B停机以进行维护的问题更加复杂。
相关问题