【问题标题】:NodeJS non-blocking I/O natureNodeJS 非阻塞 I/O 特性
【发布时间】:2017-03-14 08:18:28
【问题描述】:

我读到了 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,而 test2 由于发送了 http 请求,在 15 秒后返回 OK。当我调用test2 并在调用test1 之后立即调用test1 的响应将在15 秒后返回。如果 I/O 操作是非阻塞的,我希望 test1 的响应将立即返回。

我错过了什么?

更新:

我在 Interceptor 开启的情况下使用 Postman 发送请求。在这种情况下,Postman 一次只能向单个主机发送一个请求

所以 nodeJS 非阻塞 I/O 工作得非常好,这个问题与 Postman Interceptor 插件有关。

【问题讨论】:

  • 我对你的问题有点困惑。您显示的代码是您有疑问的代码吗?还是你做出了改变?
  • @4castle 是的,这就是代码,test2 端点调用服务,15 秒后返回响应
  • 我试试你的代码,它工作正常!你如何向你的路线发送请求?
  • 尝试在您的控制台中使用 curl -XGET http://localhost:3003/test1 它对我有用
  • @David 是的,curl 也可以,所以这是 Postman 特有的问题。似乎一次只能向单个服务器发送一个请求

标签: node.js express postman node-request


【解决方案1】:

这些操作是非阻塞的,您的代码示例证明了这一点 - 我只在一个地方修复了它,因为它不适用于 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端点也没有阻塞。

【讨论】:

  • 查看我添加的更新,问题与我用来发送请求的 Postman 有关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2016-09-16
  • 2012-06-18
  • 1970-01-01
相关资源
最近更新 更多