2015-03-08 50 views
5

在我的NodeJS發送流給客戶這樣的:如何在角度讀取nodejs流?

DockerService.get().pull('my/image', function(err, stream) { 
    if (err) { 
    return res.badRequest(err); 
    } else { 
    return stream.pipe(res); 
    } 
}); 

這是從angularjs客戶端使用$ http.get觸發:

pull: function() { 
    var url = ENV.apiEndpoint + '/docker/pull'; 
    var promise = $http.get(url).success(function(response) { 
    return response; 
    }).error(function(data, status) { 

    }); 
    return promise; 
} 

但是我無法讀取數據流。從角度我得到一個錯誤信息:

SyntaxError: Unexpected token { 
    at Object.parse (native) 
    at fromJson (file://build/vendor/angular/angular.js:1065:14) 
    at defaultHttpResponseTransform (file://build/vendor/angular/angular.js:8579:16) 
    at file://build/vendor/angular/angular.js:8664:12 
    at forEach (file://build/vendor/angular/angular.js:323:20) 
    at transformData (file://build/vendor/angular/angular.js:8663:3) 
    at transformResponse (file://build/vendor/angular/angular.js:9389:23) 
    at processQueue (file://build/vendor/angular/angular.js:13189:27) 
    at file://build/vendor/angular/angular.js:13205:27 
    at Scope.$get.Scope.$eval (file://build/vendor/angular/angular.js:14401:28) 

我找不到任何有關如何處理流角度的信息。你能幫我嗎?

接頭:

enter image description here

的響應是太大而在座它,所以這裏是它的第一部分:

enter image description here

預覽:

enter image description here

+0

,你能否告訴HTTP標頭和身體,你的服務器代碼返回?我的猜測是你的應用程序/ json的'Content-Type'頭文件不匹配,但來自'badRequest(err)'的純文本郵件正文。 – 2015-03-08 18:25:11

+0

@PeterLyons獲取請求本身返回200 OK。在鉻的網絡選項卡中,我可以看到管道響應。然而,在角度上,錯誤回調被觸發。響應類型爲JSON。 badRequest根本不被調用。 – 2015-03-08 19:21:06

+0

看到這裏,如果它適合你http:// stackoverflow。com/questions/26300350/handling-nodejs-streams-with-angularjs – 2015-03-08 19:41:53

回答

4

所以這不是有效的JSON,它是一系列以換行符分隔的(可能的)JSON消息。這就是「意外標記」{'「的意思。 Angular的內置解析器不支持開箱即用。這個問題並不是關於流與緩衝數據的關係,它只是angularjs不直接支持的主體格式。您需要確保將angular的內置解析器繞過,然後您可以將該字符串拆分爲新行,並嘗試/ catch將每行解析爲JSON對象。

僅供參考,據我所知,流入瀏覽器的最佳模塊是oboe.js。您可以使用RonB/angular-oboe加上一些代碼來緩衝每一行,然後將ndjson語法解析爲JS對象流。

1

嘗試添加:

res.attachment() 

res.writeHead(200, {'Content-Type': data.ContentType }); 

也許問題是有...

在你的代碼

它會看起來像這樣:

DockerService.get().pull('my/image', function(err, stream) { 
    if (err) { 
    return res.badRequest(err); 
    } else { 
    res.attachment('your_file.jpg'); // add file name here like req.files.name 
    return stream.pipe(res); 
    } 
}); 

DockerService.get().pull('my/image', function(err, stream) { 
    if (err) { 
    return res.badRequest(err); 
    } else { 
    res.writeHead(200, {'Content-Type': data.ContentType }); //switch data.ContentType to yours or get it from the file 
    return stream.pipe(res); 
    } 
}); 

有時使用res.attachment是不錯的主意,因爲這一切使用權頭