【问题标题】:Can't stop express server in after function无法在功能后停止快递服务器
【发布时间】:2019-10-09 20:04:51
【问题描述】:

我用这个before 函数进行节点测试:

before((done) => {
  app.startServer()
    .catch((err) => {
      done(err);
  });
});

我现在正在尝试编写一个 after 函数来停止服务器。

我希望这是:

after(() => {
  app.stopServer(apiAddress)
    .catch((err) => {
      done(err);
    })
});

但这不起作用。

这些是我的express.js 函数:

function startServer() {
  return new Promise((resolve, reject) => {
    app.listen(PORT, (err) => {
      if (err) reject(err);
      log.info(`Server listening on port ${PORT}`);
      resolve();
    });
  });
}

function stopServer(url) {
  return new Promise((resolve, reject) => {
    //const server = app.listen(url);
    app.close(url, (err) => {
      if (err) reject(err);
      log.info(`Server closed on ${url}`);
      resolve();
    });
  });
}

如何在 after 函数中停止我的 express 服务器?

【问题讨论】:

    标签: javascript node.js express testing


    【解决方案1】:

    根据this堆栈溢出问题并查看express文档。

    app.listen

    app.listen() 方法返回一个 http.Server 对象和(对于 HTTP) 是一种方便的方法:


    您调用的close 方法是Http.close 方法,其定义如下:

    server.close([callback])
    

    所以你的函数应该是这样的:

    function stopServer(url) {
      return new Promise((resolve, reject) => {
        app.close((err) => {
          if (err) reject(err);
    
          log.info(`Server closed on ${url}`);
    
          resolve();
        });
      });
    }
    

    另外,您必须知道close 函数将挂起,直到所有连接都关闭。

    看看this SO question



    注意:

    您可以使用Util.promisify 来简化语法

    function startServer() {
      return Util.promisify(app.listen)(PORT);
    }
    
    function stopServer(url) {
      return Util.promisify(app.close)();
    }
    
    before((done) => {
      app.startServer()
        .then(() => done)
        .catch(done);
    });
    
    after(() => {
      app.stopServer()
        .then(() => done)
        .catch(done);
    });
    

    【讨论】:

    • 谢谢。我把它放在一个描述块中。当下一个 describe 块运行时,在 before 函数中会抛出此错误:Uncaught Error: listen EADDRINUSE: address already in use :::1337
    • 我认为是一个旧的node.js在运行,所以地址已经被占用了。杀死进程然后它将起作用。您可以使用htopps -aux | grep node 之类的命令来识别进程。或lsof -t -i:1337 杀死它kill -9 $(sudo lsof -t -i:1337)
    • 我已经尝试过lsof -t -i:1337,没有任何乐趣。描述块之间是否存在一些可能的异步问题?
    • 我不这么认为,before会先执行然后失败
    【解决方案2】:

    我们使用“supertest”npm 包来测试 Express.js 应用程序。试试那个好东西。 https://www.npmjs.com/package/supertest

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 2015-12-17
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      相关资源
      最近更新 更多