我读到了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插件有关。
答案 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
端点也没有阻塞。