【问题标题】:How to read a nodejs stream in angular?如何以角度读取nodejs流?
【发布时间】:2015-03-08 17:27:36
【问题描述】:

在 nodejs 中,我像这样向客户端发送流:

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

这是使用 $http.get 从 angularjs 客户端触发的:

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)

我找不到有关如何以角度处理流的任何信息。你能帮帮我吗?

标题:

响应太大,这里无法呈现,所以这里是它的第一部分:

预览:

【问题讨论】:

  • 您能否显示您的服务器代码返回的 HTTP 标头和正文?我的猜测是您的 application/json 的“Content-Type”标头不匹配,但来自badRequest(err) 的纯文本消息正文不匹配。
  • @PeterLyons 获取请求本身返回 200 OK。在 chrome 的网络选项卡中,我可以看到管道响应。然而,在角度错误回调被触发。响应是 JSON 类型。 badRequest 根本没有被调用。
  • 看看这里是否适合你stackoverflow.com/questions/26300350/…
  • (真的)您能显示您的服务器代码正在运行的 HTTP 标头和正文吗?这就是我/我们可以帮助你的方式。将代码 sn-ps 与原始 HTTP 数据一起放入您的问题中,而不是其英文描述。然后我们就可以进行故障排除了。很明显响应体不是有效的 json,所以我们需要排查这是分块编码问题还是什么。
  • @PeterLyons 好的,我用标题和响应更新了我的问题。

标签: angularjs node.js


【解决方案1】:

所以这不是有效的 JSON,它是一系列以换行符分隔的(可能是)JSON 消息。这就是“意外令牌'{'”的含义。 Angular 的内置解析器不支持开箱即用。问题实际上与流数据与缓冲数据无关,它只是 angularjs 不直接支持的正文格式。您需要确保绕过 Angular 的内置解析器,然后您可以在换行符上拆分字符串并尝试/捕获将每一行解析为 JSON 对象。

据我所知,流入浏览器的最佳模块是oboe.js。您可以使用RonB/angular-oboe 加上一些代码来缓冲每一行,然后将 ndjson 语法解析为 JS 对象流。

【讨论】:

    【解决方案2】:

    尝试添加:

    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 是个好主意,因为它使用正确的标题

    【讨论】:

      猜你喜欢
      • 2022-11-07
      • 2018-04-04
      • 2019-03-14
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多