NodeJS非阻塞I / O性质

时间:2017-03-14 08:18:28

标签: node.js express postman node-request

我读到了nodeJS的非阻塞性质,以及I / O操作是如何非阻塞的。我创建了一个简单的测试来证明这个

var request = require('request');
var http = require('http');
var express = require('express');

var app = express();

app.get('/test1', function (req, res) {
  res.sendStatus(httpStatus.OK);
});
app.get('/test2', function (req, res) {
  request.get('https://httpbin.org/delay/15', function () {
    res.sendStatus(httpStatus.OK);
  });
});
var server = http.createServer(app);
server.listen(3003);

module.exports = app;

这是整个测试。 test1端点立即返回OK,而由于发送的http请求,test2在15秒后返回OK。当我呼叫test2并在呼叫test1之后立即呼叫时,会在15秒后返回test1的响应。我希望如果I / O操作是非阻塞的,那么test1的响应将立即返回。

我错过了什么?

更新

我正在使用Postman发送请求,并打开拦截器。在这种情况下,邮递员一次只能向一个主机发送一个请求

因此nodeJS非阻塞I / O工作得很好,问题与Postman Interceptor插件有关。

1 个答案:

答案 0 :(得分:2)

这些操作是非阻塞的,您的代码示例也证明了这一点 - 我只在一个地方修复了它,因为它没有使用httpStatus未定义 - 这可能是您的问题。参见:

var request = require('request');
var http = require('http');
var express = require('express');

var app = express();

app.get('/test1', function (req, res) {
  res.sendStatus(200);
});
app.get('/test2', function (req, res) {
  request.get('https://httpbin.org/delay/15', function () {
    res.sendStatus(200);
  });
});
var server = http.createServer(app);
server.listen(3003);

module.exports = app;

运行它:

time curl http://localhost:3003/test1
OK
real    0m0.015s
user    0m0.007s
sys 0m0.004s

time curl http://localhost:3003/test2
OK
real    0m10.466s
user    0m0.000s
sys 0m0.014s

事实上,您甚至可以看到您可以同时多次请求长时间运行的端点,并且所有响应将同时打印:

curl http://localhost:3003/test2 &
curl http://localhost:3003/test2 &
curl http://localhost:3003/test2 &
OKOKOK

证明不仅/test1端点没有阻塞,而且/test2端点也没有阻塞。