Как программно закрыть экземпляр ExpressJS для тестирования? - PullRequest
86 голосов
/ 28 декабря 2011

Я пытаюсь выяснить, как закрыть экземпляр Express. По сути, я хочу обратный вызов .listen(port) - как мне заставить сервер Express остановить прослушивание, освободить порт и полностью завершить работу?

Я знаю, что это может показаться странным запросом, так что вот контекст; возможно есть другой способ приблизиться к этому, и я думаю об этом неправильным способом. Я пытаюсь настроить среду тестирования для моего приложения socket.io/nodejs. Это одностраничное приложение, поэтому в моих сценариях тестирования (я использую Mocha , но это не имеет большого значения) я хочу иметь возможность запускать сервер, запускать на нем тесты и затем выключите сервер. Я могу обойти это, предполагая, что либо сервер включен перед началом теста, либо если один из тестов запускает сервер и каждый последующий тест предполагает, что он работает, но это действительно грязно. Я бы предпочел, чтобы каждый тестовый файл запускал экземпляр сервера с соответствующими настройками и затем закрывал этот экземпляр по окончании тестов. Это означает, что нет никаких странных зависимостей от запуска теста, и все чисто. Это также означает, что я могу выполнить тестирование при запуске / завершении работы.

Итак, какой-нибудь совет о том, как это сделать? Я думал о том, чтобы вручную вызывать исключения, чтобы сбить его, но это кажется грязным. Я копался в документах и ​​источниках Express, но не могу найти какой-либо метод, который выключит сервер. Для этого также может быть что-то в socket.io, но так как сервер сокетов просто подключен к серверу Express, я думаю, что это должно произойти на уровне Express.

Ответы [ 3 ]

132 голосов
/ 07 июня 2013

Все изменилось , потому что сервер экспресс больше не наследует от узла http-сервер.К счастью, app.listen возвращает экземпляр сервера.

var server = app.listen(3000);

// listen for an event
var handler = function() {
  server.close();
};
14 голосов
/ 28 декабря 2011

Используйте app.close().Полный пример:

var app = require('express').createServer();
app.get('/', function(req, res){
  res.send('hello world');
});
app.get('/quit', function(req,res) {
  res.send('closing..');
  app.close();
});
app.listen(3000);

Позвоните app.close() внутри обратного вызова, когда тесты закончились.Но помните, что процесс все еще выполняется (хотя он больше не слушает).

Если после этого вам нужно завершить процесс, то позвоните process.exit(0).

Ссылки:

app.close: http://nodejs.org/docs/latest/api/http.html#server.close (то же самое относится к)

process.exit: http://nodejs.org/docs/latest/api/process.html#process.exit

0 голосов
/ 28 декабря 2011

Вы можете легко сделать это, написав bash-скрипт для запуска сервера, запуска тестов и остановки сервера.Преимущество этого заключается в том, что вы можете использовать псевдоним этого сценария для быстрого и простого выполнения всех ваших тестов.

Я использую такие сценарии для всего процесса непрерывного развертывания.Вам следует взглянуть на Dead Simple Git Workflow Джона Рохана, чтобы узнать об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...