Node.js NodeJS设置间隔并向客户端发送数据

Node.js NodeJS设置间隔并向客户端发送数据,node.js,Node.js,我想使用setInterval执行相同的路由,将数据发送到客户端。当前,我在第二次间隔后收到一个错误:无法在将头发送到客户端后设置头 这是路线: router.get('/api/update-time', async(req, res) => { try { const users = await User.find({served: false}); let minutes; let hours; let sec

我想使用
setInterval
执行相同的路由,将数据发送到客户端。当前,我在第二次间隔后收到一个错误:
无法在将头发送到客户端后设置头

这是路线:

router.get('/api/update-time', async(req, res) => {
    try {

        const users = await User.find({served: false});
        let minutes;
        let hours;
        let seconds;

        for(let i = 0; i < users.length; i++) {
            users[i].appointment -= 5;
            users[i].save();
            seconds = Math.floor(users[i].appointment / 1000);
            minutes = Math.floor(users[i].appointment / 60);
            hours = Math.floor(minutes / 60);
        }

        setInterval(() => {
            res.json({users, hours, minutes, seconds});
        }, 5000)

    } catch (error) {
        console.log(error);
    }
});
router.get('/api/updatetime',异步(req,res)=>{
试一试{
const users=wait User.find({served:false});
让我们用分钟;
让时间;
让我们休息几秒钟;
for(设i=0;i{
res.json({用户,小时,分钟,秒});
}, 5000)
}捕获(错误){
console.log(错误);
}
});

我想每5秒钟一次又一次地发送数据。我如何才能正确地执行此操作而不发生错误

res.json结束请求的生命周期,即使请求在一段时间内被调用。为了实现你想要的,我建议不要在一个请求内完成。相反,可能是某种调度器,或者可能是在调用端点的客户端上设置间隔。

Http是请求-响应协议。如果已完成,则无法再次发送同一请求的响应。在您的情况下,只要调用
res.json({users,hours,minutes,seconds}),请求周期就会结束

您可以利用WebCoket向客户端发送实时更新。 请在此处阅读更多信息:

提供Web套接字的简单实现。
如果您不想使用
Web套接字
,则可以在客户端设置时间间隔以获取更新

发送响应时请求结束。
您可以使用restler在一段时间后再次调用api

  var rest = require('./restler');
   router.get('/api/update-time', async(req, res) => {
    try {

        const users = await User.find({served: false});
        let minutes;
        let hours;
        let seconds;

        for(let i = 0; i < users.length; i++) {
            users[i].appointment -= 5;
            users[i].save();
            seconds = Math.floor(users[i].appointment / 1000);
            minutes = Math.floor(users[i].appointment / 60);
            hours = Math.floor(minutes / 60);
        }

        setInterval(() => {
         res.json({users, hours, minutes, seconds});
         rest.get(apiUrl + '/api/update-time')
        }, 5000)

    } catch (error) {
        console.log(error);
    }
});
var rest=require('./restler');
router.get('/api/update time',async(req,res)=>{
试一试{
const users=wait User.find({served:false});
让我们用分钟;
让时间;
让我们休息几秒钟;
for(设i=0;i{
res.json({用户,小时,分钟,秒});
get(apirl+'/api/updatetime')
}, 5000)
}捕获(错误){
console.log(错误);
}
});

如果要在一段时间内将数据推送到客户端,则需要查看某种类型的套接字连接。get请求生命周期在发送响应时结束。看看@bhmahler,我现在不想在这个应用程序中使用socket。如果你不想使用socket,你必须让你的客户端应用程序每5秒ping一次服务器端点,HTTP协议不能像你想的那样工作。你可能应该像Marcelo在Clients中建议的那样使用数据池,这不是真的,也不具有误导性,HTTP协议并不禁止服务器将数据分块流式传输到客户端。客户机是否可以使用该流执行某些操作取决于客户机。早在Ajax成为一个术语之前,您就已经能够使用
chunked
编码来实现类似的功能。服务器端事件也基于HTTP,这是解决这一问题的现代方法。WebSocket也使用HTTP协议来启动连接,但使用了协议升级来允许双向流。@t.niese你说得对。我已经改正了误导性的字眼