在返回响应之前,是否可以通过持久连接发送第二个请求。 Node.js

时间:2018-12-12 16:45:52

标签: javascript node.js http server

我知道这听起来很奇怪,但是情况很奇怪。我一直在尝试在第一个响应之前将第二个请求发送到服务器(通过相同的连接)。我得到的是对第一个请求的响应,第二个请求被服务器忽略。服务器使连接保持活动状态:

class MyComponent extends Component {
  state = {
    isLoading: false,
    species: '',
  }

  handleSpecies(e) {
    console.log(e.target.text)

    this.setState({isLoading: true});

    let filteredSpecies = [];
    const url = 'http://127.0.0.1:8000/api/films/search/'+ e.target.text; 
    fetch(url)
      .then(results => {
        if(results.ok){
          return results.json();
        }
        throw new Error('Failed to fetch');
      })
      .then(data => {
        this.setState({
          species: data,
          isLoading: false,
        });
      })
      .catch((error) => {
        this.setState({ 
          error: error.message,
          isLoading: false,
        });
      });
  }


  render() {
    const {
      isLoading,
      species,
    } = this.state;

    return (
       <div className="col-md-4">
          <div className="list-group">
            { 
              isLoading 
              ? <Loading/> 
              : species.map((specie, i) => <a href="#" className="list-group-item" key={i}> {specie.name} </a>)

            } 
        </div>
      </div>
    )
  }
}

这是处理请求的路由:

server.on("connection", socket => {
  socket.setTimeout(50 * 1000);
  socket.on("timeout", () => {
    console.log("socket timeout");
    socket.end();
  });

  socket.on("close", hadError => {
    console.log(
      hadError
        ? "Socket closed due to ERROR during transmission"
        : "Socket closed"
    );
  });
});

我认为 HTTP协议不允许这样做,但是可能有一些解决方法。

Websockets 不是解决方案,因为客户端(不是浏览器)是嵌入式设备。

这是测试的图像(我使用TCP客户端程序ti模拟来自客户端的请求消息):

enter image description here

右侧终端(黑色终端)是节点服务器。白色的是终端。客户端发送的是粉红色终端上的内容。黑色为服务器的响应。您可以看到服务器在标头之后立即发送app.post("/enddev", (req, res) => { console.log("REQUEST TO ", req.route.path); console.log("Req Header ", req.headers); res.write("request\r\n"); setInterval(() => { res.write("ack\r\n"); }, 2000); }); 消息。但是,在第二次请求时,没有响应出现。

1 个答案:

答案 0 :(得分:0)

我认为您从未打过res.end()。没有这个,node.js认为您的响应还没有结束。