首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应发送数据流-使用node.js - Azure文件服务(使用node.js )

响应发送数据流-使用node.js - Azure文件服务(使用node.js )
EN

Stack Overflow用户
提问于 2015-10-19 13:03:05
回答 2查看 3.6K关注 0票数 2

我正在使用node.js为Azure文件存储创建文件服务。为此,我使用了azure-storage-node (http://azure.github.io/azure-storage-node/)

我正在尝试从Azure文件存储下载一个文件。下面是我的代码片段

代码语言:javascript
复制
// Download a file from Share
exports.get = function(request, response){
    var shareName = request.headers.sharename;
    var dirPath = request.headers.directorypath;
    var fileName = request.headers.filename;

    var fileService = azure.createFileService();

    var readStream = fileService.createReadStream(shareName, dirPath, fileName);

    var dataLength = 0;
    var body = '';
    readStream.on('data', function (chunk) {
    dataLength += chunk.length;
  })

    readStream.on('end', function(){
      console.log('The length was:', dataLength);
    });

    response.setHeader('Content-Type', 'application/json');
    response.send(statusCodes.OK, JSON.stringify("Success!"));

}

我能得到数据流。但是我如何在响应中发送流,这样我们就可以在rest呼叫中得到它。

我试过readStream.pipe(response);

代码语言:javascript
复制
response.write(typeof chunk);
response.end() but it doesnt work; 

我是node.js的新手。请帮帮我。

更新:

我试过以下几种方法。

代码语言:javascript
复制
response.writeHead(200, {'Content-Type': 'application/json'});

var readStream = fileService.createReadStream(shareName, dirPath, fileName);
readStream.pipe(response);

但它扔错了。

代码语言:javascript
复制
    ERROR
An unhandled exception occurred. Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:679:11)
    at ServerResponse.res.setHeader (D:\home\site\wwwroot\node_modules\express\node_modules\connect\lib\patch.js:59:22)
    at ServerResponse.res.set.res.header (D:\home\site\wwwroot\node_modules\express\lib\response.js:518:10)
    at addDefaultHeaders (D:\home\site\wwwroot\runtime\request\requesthandler.js:582:9)
    at ServerResponse.<anonymous> (D:\home\site\wwwroot\runtime\request\requesthandler.js:291:13)
    at ServerResponse._.wrap [as end] (D:\home\site\wwwroot\node_modules\underscore\underscore.js:692:22)
    at ChunkStream.onend (stream.js:66:10)
    at ChunkStream.EventEmitter.emit (events.js:126:20)
    at ChunkStream.end (D:\home\site\wwwroot\App_Data\config\scripts\node_modules\azure-storage\lib\common\streams\chunkstream.js:90:8)
    at Request.onend (stream.js:66:10)

fileService.createReadStream(shareName, dirPath, fileName);的返回数据类型是ChunkStream

更新:

这是我更新的代码。

代码语言:javascript
复制
    var option = new Object();
    option.disableContentMD5Validation = true;
    option.maximumExecutionTimeInMs = 20 * 60000;
    option.timeoutIntervalInMs = 20 * 6000;

    fileService.getFileToStream(shareName, dirPath, fileName, response, option, function(error, result, res) {
        if(!error) {
            if(res.isSuccessful) {
                console.log(result);
        console.log(res);
        console.log("Success!");
      }
        }
    });

但更频繁的是,我的错误越来越少。

代码语言:javascript
复制
ERROR
An unhandled exception occurred. Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:679:11)
at ServerResponse.res.setHeader (D:\home\site\wwwroot\node_modules\express\node_modules\connect\lib\patch.js:59:22)
at ServerResponse.res.set.res.header (D:\home\site\wwwroot\node_modules\express\lib\response.js:518:10)
at addDefaultHeaders (D:\home\site\wwwroot\node_modules\azure-mobile-services\runtime\request\requesthandler.js:590:9)
at ServerResponse. (D:\home\site\wwwroot\node_modules\azure-mobile-services\runtime\request\requesthandler.js:299:13)
at ServerResponse._.wrap as end
at Request.onend (stream.js:66:10)
at Request.EventEmitter.emit (events.js:126:20)
at IncomingMessage.Request.onRequestResponse.strings (D:\home\site\wwwroot\App_Data\config\scripts\node_modules\azure-storage\node_modules\request\request.js:1153:12)
at IncomingMessage.EventEmitter.emit (events.js:126:20)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-20 07:12:34

NodeJS类http.ServerResponse实现Writable Stream接口,请参考NodeJS API serverresponse1

因此,当您将数据流发送到响应response时,只需要在示例代码"getFileToStream“http://azure.github.io/azure-storage-node/#toc8中使用对象getFileToStream而不是流编写器http://azure.github.io/azure-storage-node/#toc8

以下是我的示例代码:

代码语言:javascript
复制
var http = require('http');
var azure = require('azure-storage');
var fileService = azure.createFileService('<storage_key_name>','<storage_access_key>');

http.createServer(function (request, response) {
    var shareName = request.headers.sharename;
    var dirPath = request.headers.directorypath;
    var fileName = request.headers.filename;
    response.setHeader('Content-Type', 'application/json');
    fileService.getFileToStream(shareName, dirPath, fileName, response, {disableContentMD5Validation: true}, function(error, result, response) {
            if(!error) {
                    //console.log(result);
                    //console.log(response);
                   if(response.isSuccessful) {
                                console.log("Success!");
                   }
            }
    });
}).listen(1337, "127.0.0.1");

console.log('Server running at http://127.0.0.1:1337/');

诚挚的问候。

要从Azure文件存储中获取大于4MB的文件,有一个请求头x-ms-range-get-content-md5将导致状态代码400(坏请求)错误,请参考AzureFileStoragehttps://msdn.microsoft.com/en-us/library/azure/dn194274.aspxGet File REST文档,请参见下面:

因此,我回顾了(https://github.com/Azure/azure-storage-node/blob/master/lib/services/file/fileservice.js)的源代码。对于函数getFileToTextgetFileToLocalFilecreateReadStreamgetFileToStream,您需要设置options.disableContentMD5Validation属性以避免错误,请参见下面。

  • @param {boolean} options.disableContentMD5Validation当设置为true时,在下载文件时将禁用MD5验证。

并以getFileToStream的来源为例:

在我的示例代码中,需要在调用函数{disableContentMD5Validation: true}的前面添加代码getFileToStream作为选项。

票数 4
EN

Stack Overflow用户

发布于 2015-10-20 05:36:36

您可能需要这样做:

代码语言:javascript
复制
exports.get = function(request, response) {
  var shareName = request.headers.sharename;
  var dirPath = request.headers.directorypath;
  var fileName = request.headers.filename;

  var fileService = azure.createFileService();
  var readStream = fileService.createReadStream(shareName, dirPath, fileName);    

  var dataLength = 0;
  readStream.on('data', function (chunk) {
    dataLength += chunk.length;
  })

  readStream.on('end', function(){
    response.setHeader('Content-Type', 'application/json');
    response.setHeader('Content-Length', dataLength);
  });

  readStream.pipe(response);

  response.on('finish', function (chunk) {
    response.send(statusCodes.OK, JSON.stringify("Success!"));
  })
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33215170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档