Браузер перезагружается перед сервером с grunt-express-server и grunt-contrib-watch

Я пытаюсь использовать grunt-contrib-watch вместе с grunt-express-server, чтобы перезагружать мой экспресс-сервер и страницу браузера всякий раз, когда я вносил изменения в файлы javascript. Проблема, с которой я сталкиваюсь, заключается в том, что страница перезагружается до того, как сервер будет готов, поэтому я получаю сообщение «не удается установить соединение с сервером на локальном хосте: 3000».

Вот мой Gruntfile.js:

module.exports = function(grunt) {
    'use strict';
    grunt.initConfig({
        express: {
            dev: {
                options: {
                    script: 'gui-resources/scripts/js/server.js'
                }
            }
        },

        watch: {
            express: {
                files: ['gui-resources/scripts/js/**/*.js'],
                tasks: ['express:dev'],
                options: {
                    livereload: true,
                    spawn: false
                }
            }
        }
    });

    // Load all grunt tasks declared in package.json
    require('load-grunt-tasks')(grunt);

    grunt.registerTask('default', ['express:dev', 'watch'])
};

В моем файле server.js я запускаю сервер с помощью:

    var port = 3000;
    app.listen(port, function() {
        console.log('Listening on port %d', port);
    });

Я нашел этот похожий вопрос, но предложенное там решение не применимо к мой случай, так как я записываю некоторый вывод при запуске сервера, но состояние гонки все равно появляется.

Обновление: если я удалю spawn: false из конфигурации watch:express, все будет работать, но при запуске express регистрирует ошибку:

Error: listen EADDRINUSE
at errnoException (net.js:878:11)
at Server._listen2 (net.js:1016:14)
at listen (net.js:1038:10)
at Server.listen (net.js:1104:5)
at Function.app.listen (/Users/pat/projects/sourcefabric/plugin-liveblog-embed-server/node_modules/express/lib/application.js:533:24)
at /Users/pat/projects/sourcefabric/plugin-liveblog-embed-server/gui-resources/scripts/js/server.js:86:13
at Object.context.execCb (/Users/pat/projects/sourcefabric/plugin-liveblog-embed-server/node_modules/requirejs/bin/r.js:1890:33)
at Object.Module.check (/Users/pat/projects/sourcefabric/plugin-liveblog-embed-server/node_modules/requirejs/bin/r.js:1106:51)
at Object.<anonymous> (/Users/pat/projects/sourcefabric/plugin-liveblog-embed-server/node_modules/requirejs/bin/r.js:1353:34)
at /Users/pat/projects/sourcefabric/plugin-liveblog-embed-server/node_modules/requirejs/bin/r.js:372:23

Как ни странно, несмотря на ошибку, сервер и страница перезагружаются корректно.

Вот мой код (настоящий Gruntfile больше, но Я удалил части, не относящиеся к просмотру или экспрессу, чтобы сделать вопрос более читабельным).


person Patricia Garcia    schedule 13.02.2014    source источник


Ответы (1)


Я думаю, вы должны иметь возможность использовать параметр debounceDelay с livereload, чтобы немного подождать дольше, пока ваш сервер не будет готов:

watch: {
    express: {
        files: ['gui-resources/scripts/js/**/*.js'],
        tasks: ['express:dev'],
        options: {
            livereload: true,
            spawn: false,
            debounceDelay: 1000 // in milliseconds
        }
    }
}
person Jordan Kasper    schedule 13.02.2014
comment
Спасибо! Однако это не решило проблему, даже если я ввел очень большую задержку. - person Patricia Garcia; 14.02.2014
comment
Интересно. Значит, это не проблема с перезапуском браузера после сервера? - person Jordan Kasper; 14.02.2014
comment
Извините, я не уверен, правильно ли я понял ваш вопрос, но я постараюсь немного уточнить в своем ответе. На самом деле проблема еще в том, что браузер перезагружается раньше сервера. Я вижу, как браузер перезагружается и выдает ошибку до того, как в консоли отобразится прослушивание порта 3000. debounceDelay, кажется, не меняет этого, даже используя задержку в 5000 или даже 10000 мс. - person Patricia Garcia; 14.02.2014
comment
Я отредактировал вопрос, добавив ссылку на весь код в Github, на случай, если это поможет найти проблему. - person Patricia Garcia; 14.02.2014
comment
Хм... ошибка EADDRINUSE возникает, когда порт, который хочет прослушивать ваш сервер, уже используется. Очевидно, что здесь есть и другие проблемы, помимо времени. Не знаю, что с этим делать. :( - person Jordan Kasper; 14.02.2014
comment
Да, EADDRINUSE происходит только тогда, когда я удаляю «spawn: false» (что, согласно документации grunt-express-server, необходимо для перезагрузки сервера), так что может быть проблема в этом случае в том, что сервер еще не полностью до перезапуска? В любом случае, даже с ошибкой сервер, кажется, работает, так что, может быть, я должен просто использовать его вот так. Все равно, спасибо за помощь! - person Patricia Garcia; 14.02.2014