node.js - 将持续返回数据的 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 函数会记录这些值,但不会返回它。
解决方案
如果您像查看网页一样查看 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 的中间件使这比现在更容易。
推荐阅读
- machine-learning - 如何解读 GAN 训练提高输出?
- node.js - Expo调试日志在构建时的转换函数中抛出错误
- java - 使用dense_rank()从选择中排序结果集
- css - 网格框的媒体查询不起作用
- google-cloud-platform - SonarQube 与 GCP 云构建的集成
- node.js - NPM 和 hubspot CMS/CLI 集成
- if-statement - 脚本编辑器中的多个条件问题
- python - 在熊猫中将名称设置为未命名索引
- reactjs - 使用 React-router-dom 时更改主页上的 NavBar
- c++ - 为什么在重载 = 运算符时按引用返回?