0

以下のようなさまざまな 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 の重要な経験はありません。これを修正するための助けをお願いします。

4

1 に答える 1

5

実行するgulp webserverと、gulp webserver-stop2 つのプロセスがあります。これら 2 つのプロセスは、お互いに何も知りません。

したがって、それを呼び出すと、別の Web サーバー インスタンスが開始webserver()されます。webserver-stopすでに実行中のインスタンスなどには接続しません。ポート 8000 で実行されている Web サーバーが既に 1 つあるため、EADDRINUSEエラーが発生します。

代わりに、webserver-stopタスクは実行中の Web サーバーにメッセージを送信して、それをシャットダウンする必要があります。

既に Web サーバーを実行しているので、そのメッセージを 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_ブラウザーで開いて、実行中の Web サーバー インスタンスをシャットダウンできます。

于 2016-08-16T18:06:33.023 に答える