基本问题 - 使用 Express.js 的 GRPC 服务器端流式传输仅渲染数组的第一个值(不流式传输)

问题描述 投票:0回答:1

我正在尝试使用 grpc 和express.js 为我的网络浏览器实现一个非常基本的流。但是,它只显示数组的第一个对象,不会将其余对象流式传输到 Web 浏览器。我对此很陌生,所以我想我可能只是忽略了一些东西,但暗示正确的方向会很棒。非常感谢!

原型文件

service NewsAlerts {
    rpc getNewsAlerts(NewsRequest) returns (stream NewsResponse) {}
}

message NewsRequest{
}

message NewsResponse{
    string category = 1;
    string url = 2;
}

app.js(服务器端)

var news = [{category: "Weather alert", url: "URL 1"},{category: "System update",url: "URL 2"},{category: "Current news",url: "URL 3"},{category: "Privacy & Legal",url: "URL 4"},{category: "Statistics",url: "URL 5"}]

function getNewsAlerts(call, callback) {
  for(var i = 0; i < news.length; i++){
    call.write({
      category: news[i].category,
      url: news[i].url,
    });
  }
  call.end()
}

index.js(客户端)

router.get('/news', function(req, res, next) {
  
  var call = client.getNewsAlerts({});

  call.on('data', function(response){
      res.render('news', {category:response.category, url:response.url});
  });

  call.on('end', function(){

  });

  call.on('error', function(e){
    console.log(e);
  })
});

news.ejs(客户端)

<div id="text-part">
     <%= category %>
     <%= url%>
</div>

您是否能够检测到为什么它没有流式传输并且仅在网络浏览器上发送数组的第一个值?非常感谢

-我尝试直接通过 call.write() 传入数组,但这只会将 [Object, object] 的输出显示到 Web 浏览器中。 -我还尝试在 [Object, object] 数组上使用 JSON.stringify() ,但结果相同。 -我对此很陌生,所以我可能在如何使用 res.render 方面存在逻辑错误,但任何见解都值得赞赏。

最后,数组中的字符串应该在网络浏览器上流式传输,但我无法使其工作,在传递第一个值后,调用似乎结束了。非常感谢您的帮助!

javascript express protocol-buffers grpc server-side-rendering
1个回答
0
投票

我能够修复它,我只需将数据推送到index.js中的数组中,然后渲染该数组。

更新参考代码:

Index.js

router.get('/news', function(req, res, next) {
  
  var call = client.getNewsAlerts({});
  var newsItems = [];

  call.on('data', function(response){
      newsItems.push({category: response.category, url:response.url});
  });

  call.on('end', function(){
    res.render('news', {newsItems:newsItems});
  });

  call.on('error', function(e){
    console.log(e);
  })
});

news.ejs

<div id="text-part">
    <% newsItems.forEach(function(item) { %>
       <%= item.category %>
       <%= item.url %>
    <% }); %>
</div>
© www.soinside.com 2019 - 2024. All rights reserved.