node.js - 使用 setInverval 对 nodejs 执行 GET 请求?
问题描述
我正在使用带有 express 的 nodejs 来读取 mongodb 中的集合,以便将一组消息显示给用户。我已经阅读了有关 http2 的信息,但我不知道与在客户端使用 setInterval 来接收更新的消息列表相比是否有任何显着优势。我基本上在做:
setInterval(()=>{
this.props.getSession(session_id);
}, 5000);
这将获取 mongodb 文档的 _id 并以 GET 请求的形式每 5 秒将其发送到 nodejs。这会在野外造成严重的问题吗?我基本上很害怕这会导致大规模的可怕性能问题,但我想知道除了看起来令人难以置信的复杂 http2 实现可能存在许多安全漏洞之外,我还有什么替代方案。
我想我也可以将我的问题改写为,这是否会导致我的服务器在少数用户在某个页面上运行此代码时崩溃?
解决方案
好的,所以我已经找到了处理这个问题的最佳方法,并且过多地关注消息在数据库中的存在方式是没有帮助的。我最终使用了一个名为 socket.io 的 web-socket 库。当页面加载时,我能够为连接到服务器的每个组创建唯一的“房间”。消息会话的 mongodb _id 用于动态创建房间,如下所示:
io.on('connection', async function(socket){
socket.on('session' async (session)=>{
socket.join(session.session_id); //not shown: session join authentication
});
socket.on('send', async (d)=>{
try{
const {text} = d.body;
const {token, session} = d.head;
//custom function that is async to parse jwt token and do db.MessageSession.create({})
const result = await socketMeassageAuthAndSend(session, token, text);
const {flag, user, _id, date} = result;
if(flag === 'auth'){
socket.broadcast.to(session).emit('socket_message_broadcast', {text,user,_id,date})
}else{
socket.emit("unauthorized", {message: "will place ip address here to send to admin panel"});
}}catch(err){
console.log(err);
}
});
这适用于执行通过 mongo 数据库进行身份验证和授权的更新。mongoose 不需要事件驱动,它使数据库与用户视图实时同步。
推荐阅读
- android - Opengl es 2.0片段着色器中有没有办法获得以前的片段颜色
- c# - 如何在剑道网格中同时启用 autoFitColumn() 和水平滚动?
- r - 使用 RSelenium 在多个页面上抓取网页并使用正则表达式选择电子邮件
- python - 在某些点找到最大值和最小值 Pandas Python
- javascript - PixiJS 排序精灵
- mysql - 在mysql中将两个json数组作为key-value并创建一个json对象
- php - 如何将excel文件同时导入两个带有输入标签的表格?
- flutter - 在按下的颤动上添加个人资料图片
- google-sheets - Google Sheet countif 仅使用 sumtotal 的可见数据
- python - 如何在 Python 中将 (680,) 奇异元组转换为 (680,1) 对元组?