活动句柄即使在Simple NODE JS App中也可以创建但不会销毁

时间:2018-09-16 06:11:19

标签: node.js

我正在使用最新版本的Node 10.10.0,下面是我要执行的代码的小部分。

var fs = require('fs');
const express = require('express');
const request = require('request');
const app = express();


async function fun1(req, resp){
    let response = await request.get('http://google.com');
      if (response.err) { console.log('error');}
      else { resp.send('fetched response'); };
  }

app.get('/', (req, res) => {
    fun1(req, res);
});

app.listen(3000, () => {
    console.log('Example app listening on port 3000!');
});

我也正在使用诊所医生check performance bottleneck for above code

我正在运行以下命令;

clinic doctor --on-port 'autocannon -c100 localhost:3000' -- node index.js

执行上述命令后,我进入控制台输出以下。

Example app listening on port 3000!
Running 10s test @ http://localhost:3000
100 connections

Stat         Avg    Stdev   Max
Latency (ms) 94.72  75.87   1077.87
Req/Sec      827    257.35  1248
Bytes/Sec    180 kB 55.7 kB 270 kB

9k requests in 11s, 1.96 MB read
9 errors (0 timeouts)
Analysing data
Generated HTML file is 3884.clinic-doctor.html
You can use this command to upload it:
clinic upload 3884.clinic-doctor

我也生成了一个不错的UI,它会如下自动打开

enter image description here

问题 为什么我的应用程序在经过性能瓶颈测试后仍然继续创建活动句柄(如图像的第4个图表所示)?我需要关闭任何东西吗?我忘了什么吗?

1 个答案:

答案 0 :(得分:0)

首先,非常感谢这个示例,我正在寻找一个Node.js压力测试工具。

您的示例设置不正确,request不适用于Promises。有additional packages个可与Bluebird或本地Promise一起使用的

我已使用async / await调整了您的示例:

const express = require('express');
const request = require('request-promise-native');
const app = express();


function fun1(req, resp) {
  return request.get('http://google.com');
}

app.get('/', async (req, res) => {
  try {
    await fun1();
    res.send('fetched response');
  } catch (error) {
    res.send('error')
  }
});

app.listen(3000, () => {
  console.log('Example app listening on port 3000!');
});

结果:

node-clinic

请记住,您还必须正常关闭所有挂起的服务器实例,如本StackOverflow question所示。