dtn51137
2018-02-05 14:00
浏览 275
已采纳

如何使Node.js有效地处理多个请求?

I am trying to write a Node.js application which accepts incoming requests from client and then make a call to some web service on the remote server to retrieve data.

const express = require('express')
const request = require('request')
const moment = require('moment')

const app = express()

app.get('/', (req, res) => {

    request('http://localhost/sleep.php', (error, response, body) => {
        res.send('get data at ' + moment().format())
    })

})

app.listen(3000)

The remote service is written in PHP:

<?php

    sleep(10);
    echo 'Return something!';

The problem is that if the new request comes in then Node.js is blocked until it has finished the last callback. How to fix this? Any ideas?

Update:

I actually make two requests at the same time via Firefox and the second request spent almost 20 seconds.

Please see the image here

图片转代码服务由CSDN问答提供 功能建议

我正在尝试编写一个Node.js应用程序,该应用程序接受来自客户端的传入请求,然后调用某个Web 远程服务器上的服务以检索数据。

  const express = require('express')
 nconst request = require('request')
 nconst moment = require('moment  ')
 
 nstst app = express()
 
app.get('/',(req,res)=&gt; {
 
 request('http://localhost/sleep.php',( 错误,响应,正文)=&gt; {
 res.send('获取数据'+ moment()。format())
})
 
})
 
app.listen(3000)\  n   
 
 

远程服务是用PHP编写的:

 &lt;?php 
 
 sleep(10)  ; 
 echo'返回一些东西!'; 
   
 
 

问题是如果新请求进来,那么Node.js会被阻止,直到它完成最后一次回调为止 。 如何解决这个问题? 有什么想法吗?

更新:

我实际上是通过Firefox同时发出两个请求,第二个请求花了 差不多20秒。

请看这里的图像

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • drnmslpz42661 2018-02-05 16:45
    已采纳

    Here's a quick demonstration that concurrent requests for the same URL will not be pipelined by the browser, but different URLs generally will. Adding a distinct value to the query string is a technique to work around this: localhost:3000/?1517849200341 using Date.now() for instance.

    (Broadly speaking, pipelining is disabled in HTTP/1.1, but browsers will use multiple TCP connections to the same end. Pipelining is part of HTTP/2 by setting the maximum number of streams. I don't really know what this means or how to interpret the result below.)

    async function log(fn) {
      console.log(Date());
      await Promise.all(fn());
      console.log(Date());
    }
    
    const req1 = 'https://httpbin.org/delay/1';
    const req2 = 'https://nghttp2.org/httpbin/delay/1';
    
    const req3 = 'https://httpbin.org/delay/1?a';
    const req4 = 'https://httpbin.org/delay/1?b';
    const req5 = 'https://httpbin.org/delay/1?c';
    const req6 = 'https://httpbin.org/delay/1?d';
    
    const req7 = 'https://nghttp2.org/httpbin/delay/1?a';
    const req8 = 'https://nghttp2.org/httpbin/delay/1?b';
    const req9 = 'https://nghttp2.org/httpbin/delay/1?c';
    const req10 = 'https://nghttp2.org/httpbin/delay/1?d';
    
    btn1.addEventListener('click', () => log(() => [
      fetch(req1),
      fetch(req1),
      fetch(req1),
      fetch(req1),
      fetch(req1),
    ]));
    
    btn2.addEventListener('click', () => log(() => [
      fetch(req2),
      fetch(req2),
      fetch(req2),
      fetch(req2),
      fetch(req2),
    ]));
    
    btn3.addEventListener('click', () => log(() => [
      fetch(req1),
      fetch(req3),
      fetch(req4),
      fetch(req5),
      fetch(req6),
    ]));
    
    btn4.addEventListener('click', () => log(() => [
      fetch(req2),
      fetch(req7),
      fetch(req8),
      fetch(req9),
      fetch(req10),
    ]));
    <button id=btn1>HTTP/1.1, same URLs</button>
    <button id=btn2>HTTP/2, same URLs</button>
    <button id=btn3>HTTP/1.1, different URLs</button>
    <button id=btn4>HTTP/2, different URLs</button>

    </div>
    
    评论
    解决 无用
    打赏 举报
  • 查看更多回答(1条)

相关推荐 更多相似问题