Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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
Node.js express.router()的路由是否同步?_Node.js_Express - Fatal编程技术网

Node.js express.router()的路由是否同步?

Node.js express.router()的路由是否同步?,node.js,express,Node.js,Express,这一直困扰着我。。。下面的测试表明,请求是异步接收的,响应是异步的,但所有请求都是先接收,然后响应。。。给定以下3个文件: package.json { "name": "express-router-sync-test", "version": "1.0.0", "description": "Testing if express router has sync aspect", "scripts": { "start": "node serve

这一直困扰着我。。。下面的测试表明,请求是异步接收的,响应是异步的,但所有请求都是先接收,然后响应。。。给定以下3个文件:

package.json

{
    "name": "express-router-sync-test",
    "version": "1.0.0",
    "description": "Testing if express router has sync aspect",
    "scripts": {
        "start": "node server.js"
    },
    "dependencies": {
        "body-parser": "1.16.0",
        "express": "4.14.1",
        "request": "2.79.0"
    }
}
server.js

const express = require('express');
const bodyParser = require('body-parser');
const router = express.Router();
const request = require('request');

// Create our Express application
let app = express();

let port = 1111;

// body parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.use(router);

// Start the server
app.listen(port);
console.log('Server listening on port ' + port + '.');


router.get('/', _get);
router.post('/test', _test);

function _test(req, res) {
    console.log('starting to process request # ', req.body.requestNumber);
    request({
        method: 'GET',
        url: 'http://localhost:1111'
    }, (err, response, body) => {
        console.log('process # ' +  req.body.requestNumber + ' has ended');
    });
}

function _get(req, res) {
    res.json({ success: true });
}
test.js

const request = require('request');

let i;
let len = 500;
let options = {
    method: 'POST',
    url: 'http://localhost:1111/test'
}

for (i = 0; i < len; i++) {
    options.form = { requestNumber: i + 1 };
    request(options, (err, response, body) => {
        if (err) console.log(err);
        if (response) console.log(body)
    }); 
}
采取以下步骤复制测试:

  • 在终端中,导航到app dir并运行
    npm install
  • 运行
    node server.js
  • 打开另一个终端,导航到app dir并运行
    node test.js
如果查看server.js终端的输出,您会注意到所有“启动进程”日志都分组在一起,但顺序是异步的。您还将注意到,所有“进程结束”日志都分组在一起,但也是以异步顺序进行的

我现在提出两个问题:

  • 为什么在收到所有请求之后才回复
  • 这是不是因为我的要求太多了
如有任何信息,将不胜感激

编辑:下面是这个测试运行的示例日志,它包含50个请求,而不是500个。您会注意到,在收到所有请求之前,不会响应任何请求。发送的请求越多,等待第一个响应的时间就越长

starting to process request #  1
starting to process request #  2
starting to process request #  3
starting to process request #  4
starting to process request #  5
starting to process request #  6
starting to process request #  9
starting to process request #  8
starting to process request #  7
starting to process request #  10
starting to process request #  12
starting to process request #  11
starting to process request #  13
starting to process request #  17
starting to process request #  16
starting to process request #  15
starting to process request #  14
starting to process request #  21
starting to process request #  19
starting to process request #  20
starting to process request #  18
starting to process request #  22
starting to process request #  23
starting to process request #  25
starting to process request #  24
starting to process request #  27
starting to process request #  28
starting to process request #  26
starting to process request #  32
starting to process request #  31
starting to process request #  30
starting to process request #  29
starting to process request #  36
starting to process request #  35
starting to process request #  33
starting to process request #  34
starting to process request #  40
starting to process request #  38
starting to process request #  39
starting to process request #  37
starting to process request #  44
starting to process request #  42
starting to process request #  43
starting to process request #  41
starting to process request #  45
starting to process request #  46
starting to process request #  47
starting to process request #  49
starting to process request #  48
starting to process request #  50
process # 1 has ended
process # 2 has ended
process # 4 has ended
process # 3 has ended
process # 5 has ended
process # 6 has ended
process # 9 has ended
process # 8 has ended
process # 11 has ended
process # 12 has ended
process # 10 has ended
process # 7 has ended
process # 13 has ended
process # 17 has ended
process # 15 has ended
process # 16 has ended
process # 14 has ended
process # 21 has ended
process # 22 has ended
process # 18 has ended
process # 20 has ended
process # 19 has ended
process # 27 has ended
process # 24 has ended
process # 25 has ended
process # 23 has ended
process # 31 has ended
process # 32 has ended
process # 26 has ended
process # 28 has ended
process # 30 has ended
process # 29 has ended
process # 34 has ended
process # 35 has ended
process # 33 has ended
process # 36 has ended
process # 40 has ended
process # 38 has ended
process # 39 has ended
process # 37 has ended
process # 44 has ended
process # 42 has ended
process # 46 has ended
process # 45 has ended
process # 41 has ended
process # 43 has ended
process # 47 has ended
process # 50 has ended
process # 48 has ended
process # 49 has ended
下面的测试表明,请求是异步接收的,响应是异步的,但所有请求都是先接收,然后响应

现在还不清楚这里的惊喜是什么。首先接收请求,然后响应请求?在收到请求之前对其作出响应没有多大意义

因为这是一个非常普遍的问题,所以我可能会添加一些一般信息。首先,异步并不一定意味着无序,如果这是您的假设的话。操作可以按顺序或无序异步处理,这与所使用的并发模型无关

现在,一般来说,每个返回值的函数(除非该值是一个承诺)都必须同步工作,因为它不能返回它没有的任何东西。从这个意义上讲,承诺本身实际上是同步创建和返回的。异步完成的是承诺的解析

每个接受回调的函数通常都是异步工作的,但不一定非要这样。回调可以同步调用,有时也可以,就像对数组和字符串的
.map()
方法的回调一样。每个返回承诺的函数都应该异步工作,但也可以在返回承诺之前同步解析承诺


关键是,同步和异步与执行顺序完全不同,这还取决于您使用的是承诺还是继续传递方式。

对于任何遇到这种行为并感到好奇的人来说。。。之所以会发生这种情况,是因为请求来得太快,以至于NodeJS“卡在”事件循环的轮询阶段

下面是一些关于的NodeJS文档


链接中的相关信息:“如果轮询队列不是空的,则事件循环将迭代其回调队列,同步执行它们,,直到队列耗尽或达到系统相关的硬限制。”

请显示您获得的控制台输出和您期望的输出,以便我们了解您对什么感到惊讶。问题似乎很模糊。“惊讶”是所有500个响应都是首先收到的,然后才对其中任何一个做出响应。接收到的第一个请求的处理将延迟,直到所有500个请求都被接收。
starting to process request #  1
starting to process request #  2
starting to process request #  3
starting to process request #  4
starting to process request #  5
starting to process request #  6
starting to process request #  9
starting to process request #  8
starting to process request #  7
starting to process request #  10
starting to process request #  12
starting to process request #  11
starting to process request #  13
starting to process request #  17
starting to process request #  16
starting to process request #  15
starting to process request #  14
starting to process request #  21
starting to process request #  19
starting to process request #  20
starting to process request #  18
starting to process request #  22
starting to process request #  23
starting to process request #  25
starting to process request #  24
starting to process request #  27
starting to process request #  28
starting to process request #  26
starting to process request #  32
starting to process request #  31
starting to process request #  30
starting to process request #  29
starting to process request #  36
starting to process request #  35
starting to process request #  33
starting to process request #  34
starting to process request #  40
starting to process request #  38
starting to process request #  39
starting to process request #  37
starting to process request #  44
starting to process request #  42
starting to process request #  43
starting to process request #  41
starting to process request #  45
starting to process request #  46
starting to process request #  47
starting to process request #  49
starting to process request #  48
starting to process request #  50
process # 1 has ended
process # 2 has ended
process # 4 has ended
process # 3 has ended
process # 5 has ended
process # 6 has ended
process # 9 has ended
process # 8 has ended
process # 11 has ended
process # 12 has ended
process # 10 has ended
process # 7 has ended
process # 13 has ended
process # 17 has ended
process # 15 has ended
process # 16 has ended
process # 14 has ended
process # 21 has ended
process # 22 has ended
process # 18 has ended
process # 20 has ended
process # 19 has ended
process # 27 has ended
process # 24 has ended
process # 25 has ended
process # 23 has ended
process # 31 has ended
process # 32 has ended
process # 26 has ended
process # 28 has ended
process # 30 has ended
process # 29 has ended
process # 34 has ended
process # 35 has ended
process # 33 has ended
process # 36 has ended
process # 40 has ended
process # 38 has ended
process # 39 has ended
process # 37 has ended
process # 44 has ended
process # 42 has ended
process # 46 has ended
process # 45 has ended
process # 41 has ended
process # 43 has ended
process # 47 has ended
process # 50 has ended
process # 48 has ended
process # 49 has ended