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
端点也不阻塞。