Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';t在after功能中停止express server_Javascript_Node.js_Express_Testing - Fatal编程技术网

Javascript Can';t在after功能中停止express server

Javascript Can';t在after功能中停止express server,javascript,node.js,express,testing,Javascript,Node.js,Express,Testing,在函数之前,我使用此进行节点测试: before((done) => { app.startServer() .catch((err) => { done(err); }); }); 我现在正在尝试在之后编写一个函数,该函数将停止服务器 我曾希望这是: after(() => { app.stopServer(apiAddress) .catch((err) => { done(err); }) }); 但这

在函数之前,我使用此
进行节点测试:

before((done) => {
  app.startServer()
    .catch((err) => {
      done(err);
  });
});
我现在正在尝试在
之后编写一个
函数,该函数将停止服务器

我曾希望这是:

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
服务器?

我们使用“supertest”npm包测试express.js应用程序。试试那个好东西。

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

方法返回一个http.Server对象和(对于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
功能将一直挂起,直到所有连接都关闭

看看



注:

您可以使用
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);
});

谢谢我把它放在一个街区里。当下一个descripe块运行时,在before函数中抛出此错误:
Uncaught error:listen EADDRINUSE:address ready in use:::1337
我认为旧的node.js正在运行,因此该地址已被占用。杀死进程,它就会工作。您可以使用
htop
或类似于
ps-aux | grep node
的命令来识别进程。或者
lsof-t-i:1337
所以杀了它
kill-9$(sudo lsof-t-i:1337)
我已经试过
lsof-t-i:1337
。在描述块之间是否存在一些可能的异步问题?我不这么认为,之前会先执行,然后失败