NodeJS非阻塞I / O性质

我读了关于nodeJS的非阻塞性质,以及I / O操作如何非阻塞。 我创build了一个简单的testing来certificate这一点

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; 

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

我错过了什么?

更新:

我用Interceptor打开邮递员发送请求。 在这种情况下,邮递员一次只能向一台主机发送一个请求

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

这些操作是非阻塞的,这是由你的代码示例演示的 – 我只修复它在一个地方,因为它不工作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 

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

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

这certificate不仅是/test1端点不阻塞,而且/test2端点也不阻塞。