Javascript 启动和停止gulp Web服务器

Javascript 启动和停止gulp Web服务器,javascript,angularjs,gulp,gulp-connect,Javascript,Angularjs,Gulp,Gulp Connect,我正在尝试在不同的gulp任务中启动和停止gulp Web服务器,如下所示: gulp.task('webserver', ['build'], function () { gulp.src([config.build, config.base]) .pipe(webserver({ livereload: false, directoryListing: false, open: true })); }); gulp.task('webserver

我正在尝试在不同的gulp任务中启动和停止gulp Web服务器,如下所示:

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方面没有丰富的经验,
请提供任何帮助以解决此问题。

当您运行
gulp-webserver
然后
gulp-webserver-stop
时,您有两个进程。这两个过程彼此一无所知

因此,当您在
webserver stop
中调用
webserver()
时,它只会启动另一个webserver实例。它不会连接到已经运行的实例或类似的东西。由于端口8000上已经有一个Web服务器在运行,因此会出现
EADDRINUSE
错误

相反,您的
webserver stop
任务需要向正在运行的webserver发送一条消息,使其关闭

既然您已经在运行一个Web服务器,那么您也可以通过HTTP发送该消息。您可以使用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
,或者只需在浏览器中打开以关闭正在运行的webserver实例。

当您运行
gulp webserver
然后
gulp webserver stop
时,您有两个进程。这两个过程彼此一无所知

因此,当您在
webserver stop
中调用
webserver()
时,它只会启动另一个webserver实例。它不会连接到已经运行的实例或类似的东西。由于端口8000上已经有一个Web服务器在运行,因此会出现
EADDRINUSE
错误

相反,您的
webserver stop
任务需要向正在运行的webserver发送一条消息,使其关闭

既然您已经在运行一个Web服务器,那么您也可以通过HTTP发送该消息。您可以使用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
,或者只需在浏览器中打开即可关闭正在运行的webserver实例。

您试图在同一端口上启动服务器的速度过快。您已发出事件以终止侦听器,但由于它是异步的,您必须在另一个侦听器回调中重新启动。我想停止在上述任务中启动的服务器实例。是否可以从另一个gulp任务执行此操作?您是否试图从一个终端运行
gulp Web服务器
,然后从另一个终端停止
gulp Web服务器
?是的,我想这样做。您试图在同一端口上启动服务器的速度过快。您已发出事件以终止侦听器,但由于它是异步的,您必须在另一个侦听器回调中重新启动。我想停止在上述任务中启动的服务器实例。是否可以从另一个gulp任务执行此操作?是否尝试从一个终端运行
gulp Web服务器
,然后从另一个终端停止
gulp Web服务器
?是的,我想这样做。