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