2016-08-16 6 views
0

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

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) 

У меня нет большого опыта работы с глотком и JavaScript, прежде чем, Любой помощь, чтобы исправить это, пожалуйста.

+0

Вы пытаетесь запустить сервер на том же порту слишком быстро. вы выбрали событие, чтобы убить слушателя, но, поскольку он асинхронен, вам нужно перезапустить в другом обратном вызове слушателя. –

+0

Я хочу остановить экземпляр сервера, который я начал в указанной выше задаче. Возможно ли это из другой задачи? – varun

+0

Вы пытаетесь запустить «gulp webserver» с одного терминала, а затем «gulp webserver-stop» из другого? –

ответ

3

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

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

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

Поскольку вы уже используете веб-сервер, вы можете отправить это сообщение через HTTP. Вы можете использовать middleware option из 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_ в браузере, чтобы закрыть запущенный экземпляр веб-сервера.