首页 > 解决方案 > 将持续返回数据的 API

问题描述

初学者在这里,我正在使用 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 函数会记录这些值,但不会返回它。

标签: node.jsfirebasegoogle-cloud-functions

解决方案


如果您像查看网页一样查看 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 的中间件使这比现在更容易。


推荐阅读