Запустить и остановить gulp-веб-сервер

Я пытаюсь запустить и остановить gulp-webserver в различных задачах gulp, как показано ниже:

gulp.task('webserver', ['build'], function () {
    gulp.src([config.build, config.base])
    .pipe(webserver({
    livereload: false,
    directoryListing: false,
    open: true
  }));
});

gulp.task('webserver-stop', function () {
    var stream = gulp.src([config.build, config.base])
      .pipe(webserver());
    stream.emit('kill');
});

Я могу успешно запустить сервер, но когда я пытаюсь прекратить использование gulp webserver-stop, это дает следующую ошибку.

[19:36:30] Finished 'webserver-stop' after 27 ms
events.js:160
  throw er; // Unhandled 'error' event
  ^

Error: listen EADDRINUSE 127.0.0.1:8000
at Object.exports._errnoException (util.js:1008:11)
at exports._exceptionWithHostPort (util.js:1031:20)
at Server._listen2 (net.js:1253:14)
at listen (net.js:1289:10)
at net.js:1399:9
at GetAddrInfoReqWrap.asyncCallback [as callback] (dns.js:65:16)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:84:10)

У меня нет значительного опыта работы с gulp и javascript раньше, пожалуйста, помогите исправить это.

1 ответ

Решение

Когда ты бежишь gulp webserver а потом gulp webserver-stop у вас есть два процесса. Эти два процесса ничего не знают друг о друге.

Поэтому, когда вы вызываете webserver() в webserver-stop это просто запускает другой экземпляр веб-сервера. Он не соединяется с уже запущенным экземпляром или чем-то подобным. И поскольку на порту 8000 уже работает один веб-сервер, вы получаете EADDRINUSE ошибка.

Вместо вашего webserver-stop Задача должна отправить сообщение на работающий веб-сервер, который вызывает его завершение.

Поскольку вы уже используете веб-сервер, вы можете также отправить это сообщение по HTTP. Вы можете использовать middleware вариант gulp-webserver для достижения этой цели:

var gulp = require('gulp');
var webserver = require('gulp-webserver');
var http = require('http');

gulp.task('webserver', function () {
  var stream = gulp.src(['.'])
    .pipe(webserver({
      livereload: false,
      directoryListing: false,
      open: true,
      middleware: function(req, res, next) {
        if (/_kill_\/?/.test(req.url)) {
          res.end();
          stream.emit('kill');
        }
        next();
      }
    }));
});

gulp.task('webserver-stop', function (cb) {
  http.request('http://localhost:8000/_kill_').on('close', cb).end();
});

Теперь вы можете вызвать gulp webserver-stop в другом окне терминала или просто открыть http://localhost:8000/_kill_ в браузере, чтобы закрыть запущенный экземпляр веб-сервера.

Другие вопросы по тегам