NodeJS Express使用async/await时无法并发处理请求问题问询
问题根因
你观测到的串行现象和Express、async/await、NodeJS的非阻塞特性完全无关,是主流浏览器的同请求排队策略导致的:对于完全相同的GET请求(同URL、同请求头、无差异化参数),浏览器会主动将第二个请求加入等待队列,直到前一个请求拿到响应后,才会真正发出第二个请求,你的服务端从始至终都没有在同一时间收到两个请求,自然不会打印并行日志。
验证方法
你可以用两种方式验证NodeJS的非阻塞特性是正常生效的:
- 给两个请求加不同的随机查询参数,比如第一个标签页访问
http://你的服务地址/?q=1,第二个访问http://你的服务地址/?q=2,就能看到两个请求的接收日志几乎同时打印,10秒后也会几乎同时返回结果,符合并行处理的预期。 - 不用浏览器测试,打开两个终端窗口,分别执行
curl http://你的服务地址发起请求,同样可以观测到并行处理的效果。
补充说明
- 你的代码写法本身没有问题,不需要额外配置Express,async/await的使用也是正确的。NodeJS的单线程非阻塞特性指的就是主线程不会傻等定时器、数据库查询、网络请求这类IO操作完成,会先去处理其他进来的请求,符合你测试的预期。
- 注意代码里的全局变量
i是所有请求共享的,并行请求会同时修改它的值,实际业务中不要用全局变量存储请求级别的状态,避免数据污染。
内容的提问来源于stack exchange,提问作者SnoopyMe
相关产品推荐
相关产品推荐

