2016-08-16 59 views
0

我試圖啓動和停止吞掉,Web服務器在不同一飲而盡任務象下面這樣:啓動和停止吞掉,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'); 
}); 

我能夠成功地啓動服務器,但是當我嘗試停止使用​​,它會產生以下錯誤。

[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然後​​您有兩個進程。這兩個過程對彼此一無所知。

所以當你調用webserver()webserver-stop只是啓動另一個webserver實例。它不連接到已經運行的實例或類似的東西。而且由於已經有一個在8000端口上運行的網絡服務器,你會得到一個EADDRINUSE錯誤。

取而代之的是您的webserver-stop任務需要向正在運行的Web服務器發送一條消息,使其關閉。

由於您已經在運行網絡服務器,所以您最好通過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(); 
}); 

現在你可以在瀏覽器中的另一個終端窗口調用​​或只需打開http://localhost:8000/_kill_關閉正在運行的Web服務器實例。