我可以使用fs.readFile而不是fs.readFileSync。我可以使用套接字流吗?

时间:2018-04-11 19:50:27

标签: javascript node.js asynchronous websocket google-cloud-platform

Google API的Node.js示例包含此内容(用于服务器代码)。这是来自Google在GitHub上的示例,简化为此目的:

const audio = {
    content: fs.readFileSync(filename).toString('base64'),
};

const request = {
    audio: audio,
};

return client
    .longRunningRecognize(request)
    .then(
       ...
    })

这让我感到惊讶(因为我认为async是Node.js服务器代码的标准)。我想知道我是否可以用fs.readFile替换它(这是异步版本)。

编辑:上面的部分似乎至少部分由一个简单的“是”回答,谢谢。但我不明白如何修复base64部分(并避免在内存中有大文件)。

然而,我真正想做的是使用套接字将文件流式传输到此API。我可以这样做(如果我在如何做足够长的时间而努力......)?

编辑:我会很感激在这里使用套接字的一些例子。我如何流式传输到上面的结构?

编辑2:有一个库socked-io.file,但我不知道如何将其纳入上面的API接口。可以吗?

编辑3:在我的API代码中,文件已经在服务器上,但我想上传文件。 (抱歉有困惑。)

1 个答案:

答案 0 :(得分:2)

如果您查看过client.longRunningRecognize()的文档,您会看到request.audio 包含Google云端商店音频文件的URI。

基于此方法,您可以选择将fs.createReadStream(filename)作为上传流式传输到该位置,然后使用client.longRunningRecognize()使用RecognitionAudio#uri调用带有请求对象的RecognitionAudio#content到流式上传的目标位置而不是fs.readFileSync()作为文件的base64字符串。

这样可以防止像fs.readFileSync()那样阻塞事件循环,并且可以避免像fs.readFile() protobuffer那样缓存内存中的整个文件。

似乎将RecognitionAudio#content传递给[call()][2]可以让您直接将音频数据流式传输到API请求,但查看该方法需要更多了解this的方式的工作原理。