【问题标题】:Browser reloaded before server with grunt-express-server and grunt-contrib-watch使用 grunt-express-server 和 grunt-contrib-watch 在服务器之前重新加载浏览器
【发布时间】:2014-02-13 17:15:06
【问题描述】:

每当我对 javascript 文件进行更改时,我都会尝试使用 grunt-contrib-watchgrunt-express-server 重新加载我的快速服务器和浏览器页面。我遇到的问题是页面在服务器准备好之前重新加载,所以我得到“无法在 localhost: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);
    });

我发现了类似的question,但那里提出的解决方案不适用于我的情况,因为我在服务器启动时记录了一些输出,但仍然出现了竞争条件。

更新: 如果我从 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

很奇怪,尽管出现错误,但服务器和页面重新加载正确。

这是我的code(真正的 Gruntfile 更大,但我删除了与 watch 或 express 无关的部分以使问题更具可读性)。

【问题讨论】:

    标签: express gruntjs grunt-contrib-watch


    【解决方案1】:

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

    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 错误发生在您的服务器要侦听的端口已被使用时。显然,这里不仅仅是时间问题,还有其他问题。不知道该怎么做。 :(
    猜你喜欢
    • 1970-01-01
    • 2014-11-19
    • 2017-03-18
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2015-06-25
    相关资源
    最近更新 更多