使用grunt express server和grunt contrib watch在服务器之前重新加载浏览器

使用grunt express server和grunt contrib watch在服务器之前重新加载浏览器,express,gruntjs,grunt-contrib-watch,Express,Gruntjs,Grunt Contrib Watch,每当我对javascript文件进行更改时,我都尝试使用与来重新加载我的express服务器和浏览器页面。我遇到的问题是,在服务器准备就绪之前,页面会重新加载,因此我遇到一个问题:无法在localhost:3000上建立与服务器的连接 这是我的Grunfile.js: module.exports = function(grunt) { 'use strict'; grunt.initConfig({ express: { dev: {

每当我对javascript文件进行更改时,我都尝试使用与来重新加载我的express服务器和浏览器页面。我遇到的问题是,在服务器准备就绪之前,页面会重新加载,因此我遇到一个问题:无法在localhost:3000上建立与服务器的连接

这是我的Grunfile.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);
    });
我发现这与此类似,但这里提出的解决方案不适用于我的案例,因为我在服务器启动时记录了一些输出,但竞争条件仍然出现

更新: 如果我从watch:express配置中删除'spawn:false',一切正常,但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文件更大,但我删除了与watch或express无关的部分,以使问题更具可读性。

我认为您应该能够使用with livereload等待更长的时间,直到您的服务器准备就绪:

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

谢谢尽管如此,这并没有解决问题,即使我引入了一个非常大的延迟。那么,在服务器启动后重新启动浏览器不是问题吗?对不起,我不确定我是否正确理解了您的问题,但我将在回答中尝试详细阐述一下。实际上,问题仍然是浏览器在服务器启动之前重新启动。我可以在控制台中看到浏览器在监听端口3000之前重新加载并给出错误。debounceDelay似乎没有改变这一点,甚至使用了5000甚至10000毫秒的延迟。我编辑了这个问题,在Github中添加了一个指向整个代码的链接,以防它有助于发现问题。嗯。。。嗯,当服务器要侦听的端口已经在使用时,就会发生EADDRINUSE错误。显然,除了时间安排之外,还有其他问题。我不知道该怎么办