Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为同一请求发送两个响应_Javascript_Node.js - Fatal编程技术网

Javascript 为同一请求发送两个响应

Javascript 为同一请求发送两个响应,javascript,node.js,Javascript,Node.js,在Node.js中,假设服务请求需要时间。因此,在收到请求后,服务器希望回复“我恢复了您的请求,我会很快回复您”。然后,一旦请求的处理结束,服务器希望,这一次,返回给客户机实际的响应。我们怎么能做到呢? 下面的代码段出现错误(连接关闭或其他) 不能对同一请求发送两个响应。每个请求只能发送一个完整格式的响应。这就是http规范 据我所知,针对您的问题,唯一的解决办法是: 在刷新流模式下使用http。在这里,您发送部分响应,刷新它,这样您就知道它被发送了,并且您在另一端有一种特殊类型的客户端,它正在

在Node.js中,假设服务请求需要时间。因此,在收到请求后,服务器希望回复“我恢复了您的请求,我会很快回复您”。然后,一旦请求的处理结束,服务器希望,这一次,返回给客户机实际的响应。我们怎么能做到呢? 下面的代码段出现错误(连接关闭或其他)


不能对同一请求发送两个响应。每个请求只能发送一个完整格式的响应。这就是http规范

据我所知,针对您的问题,唯一的解决办法是:

  • 在刷新流模式下使用http。在这里,您发送部分响应,刷新它,这样您就知道它被发送了,并且您在另一端有一种特殊类型的客户端,它正在读取部分响应并对其进行解释(不是通常读取http响应的方式,也不是浏览器本身所做的)

  • 在最终发送实际http响应之前,使用websocket或socket.io连接来更新客户端。用户将连接socket.io连接,然后发出长时间运行的http请求,然后接收socket.io连接的常规进度,然后在完成时接收http响应。这可以简单地在任何网页上完成,没有太多困难。唯一需要解决的主要问题是,您必须安装一种将webSocket或socket.io连接与传入http连接相关联的方法(通常可以通过会话cookie完成),以便知道哪个webSocket或socket.io连接与刚刚到达的http请求相关联

  • 使用其他一些将第二个响应“推送”到客户端

  • 实现客户端轮询。发送一个初始http响应,指示客户端在NN ms中重新检查,以查看响应是否有更多内容。当客户端在NN毫秒后再次检查时,您要么为他们获得最终响应并发送,要么再次响应,告诉他们在NN毫秒内再次检查,等等


  • 您正在寻找服务器发送的事件(SSE),当然您可以发送分块数据,只是在发送最后一段数据之前不要调用
    res.end()
    。顺便说一下,您只能发送一次标题。请参见此示例:

    res.writeHead(200);
    res.write("The first piece of data");
    setTimeout(()=>{
        res.write("This piece of data will be sent in 1 second.");
        res.end("Ok, all data has be send, now close the connection.");
    }, 1000);
    

    你不能,结束。使用HTTProtocol,每个请求只能得到一个响应,因此,如果响应为“尚未”,则只需安排更多的请求,或者设置一个直接套接字连接,以便客户端和服务器可以使用推送通知协议而不是标准的HTTP进行通信。@Mike'Pomax'Kamermans请详细说明。没有什么需要详细说明的:“否:HTTP不允许您发送多个响应。一个请求在收到一个响应时被视为已处理”。如果你想做更多的事情,你必须设计一个RESTful架构,或者你需要使用一个不同的协议,允许像WebSocket这样的任意通信。更不用说你可以在客户端使用异步性让客户端做其他事情(比如显示微调器)当它等待请求完成时。服务器也可以是异步的,因此,如果完成响应的构建很慢,那么在等待以前的响应完成时处理其他请求。Socket.io将是解决此问题的好方法
    res.writeHead(200);
    res.write("The first piece of data");
    setTimeout(()=>{
        res.write("This piece of data will be sent in 1 second.");
        res.end("Ok, all data has be send, now close the connection.");
    }, 1000);