【问题标题】:Start and stop gulp-webserver启动和停止 gulp-webserver
【发布时间】:2016-08-16 14:19:05
【问题描述】:

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

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 任务?
  • 您是否尝试从一个终端运行gulp webserver,然后从另一个终端运行gulp webserver-stop
  • 是的,我想这样做。

标签: javascript angularjs gulp gulp-connect


【解决方案1】:

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

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

您的webserver-stop 任务需要向正在运行的网络服务器发送一条消息,导致其关闭。

由于您已经在运行网络服务器,您不妨通过 HTTP 发送该消息。您可以使用gulp-webservermiddleware option 来实现:

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_ 以关闭正在运行的网络服务器实例。

【讨论】:

    猜你喜欢
    • 2016-07-19
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多