【问题标题】:API that will continuously return data将持续返回数据的 API
【发布时间】:2019-04-29 20:11:12
【问题描述】:

这里是初学者,我正在使用 Firebase 实时数据库,我需要我的 API 在添加某些内容时不断返回该值,请参阅下面的代码。

apiCalls.get('/api/getallusers',function(req,res){
  userFunc.getAllUsers(function(err,result){
    if (err) return res.status(500).send('internal server error!');
    res.status(200).write(JSON.stringify(result));
    res.end();
    return res;
  })
})

这将返回错误

Error [ERR_STREAM_WRITE_AFTER_END]: write after end

但如果我删除 res.end 它将显示 1 条记录并不断加载直到页面超时..

是我正在做的可能还是有不同的方法来做到这一点。

我也在为这个 api 使用 firebase 云函数。

更新:

已上传 API,但未返回任何内容...

这里是链接https://us-central1-testproject-e6819.cloudfunctions.net/api1/api/getUser

试过axios和事件源

Firebase 函数会记录值,但不会返回它..

【问题讨论】:

  • "但是如果我删除 res.end 它将显示 1 条记录并不断加载直到页面超时.." 这不是 您想要的吗?
  • 例如,如果移动设备连接到该 API,该设备是否也会遇到类似的超时?
  • 我担心当我在浏览器中访问该 API 时它只显示 1 条记录,但在我的终端日志中它确实返回更多值

标签: node.js firebase google-cloud-functions


【解决方案1】:

如果您像查看网页一样查看 API 响应,则您的浏览器正在缓冲它接收到的数据,直到有足够的数据来形成一个更完整的页面。您的浏览器期待的是结束的内容,而不是无尽的数据流。

如果您希望能够继续写入输出流,您应该删除.end()

此外,我建议为此使用服务器发送事件 (SSE) 协议。 https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events 它提供了一个很好的基于标准的抽象,使得在客户端处理事件流变得非常容易。

const eventSource = new EventSource('https://api.example.com/someApi');
eventSource.addEventListener('userupdate', (e) => {
  console.log(e.data);
});

在服务器端,有几个基于 Express 的中间件可以让这变得比现在更容易。

【讨论】:

  • 谢谢!这个监听器就是我需要的。
  • 显然它什么都不返回..我的firebase云功能中有日志,但它没有在我的客户端返回任何东西这是我的链接..us-central1-testproject-e6819.cloudfunctions.net/api1/api/…我使用了那个方法和axios..我我为我的客户使用反应
【解决方案2】:

云函数中的操作必须是相对短暂的并且确定性地结束。无法保持从 Cloud Functions 到客户端的连接打开。

通常考虑是什么触发了发送新数据的需求。例如,如果它是由注册新用户触发的,您可以使用trigger your Cloud Functions from Firebase Authentication。然后,该函数可以例如写入实时数据库(或 Cloud Firestore),您的客户端/应用程序会监听数据库以获取实时更新。这样,您就可以按照设计的方式使用 Firebase 的所有部分:Cloud Functions 用于从系统中的事件触发的短期更新,以及用于发送实时更新的实时数据库或 Cloud Firestore。

如果这对您的用例不起作用,您将需要一个运行时环境,让您可以保持进程处于活动状态。为此,我们想到了 App Engine flex、Kubernetes 或许多其他选项。

【讨论】:

  • 感谢您的解释,因为我打算仅使用 API 将实时值实时传递到移动设备,所以这是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2014-11-21
相关资源
最近更新 更多