这是我的Gruntfile:

module.exports = function(grunt) {

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    watch: {
      serve: {
        files: ['server.js', 'src/**/*.coffee'],
        tasks: ['coffee', 'develop'],
        options: {
          nospawn: true
        }
      },
      css: {
        files: ['lib/less/main.less'],
        tasks: ['less'],
        options: {
          nospawn: true
        }
      },
      test: {
        ...
      }
    },

    jasmine_node: {
     ...
    },
    develop: {
      server: {
        file: 'server.js'
      }
    },
    coffee: {
      compile: {
        expand: true,
        bare: true,
        cwd: 'src/',
        src: ['**/*.coffee'],
        dest: 'lib/',
        ext: '.js'
      }
    },
    copy: {
    ...
    },

    jasmine: {
      ...
    },
    less: {
      ..
    },
    concurrent: {
      options: {
        logConcurrentOutput: true
      },
      serve: {
        tasks: ["watch:css", "watch:serve"]
      },
    }
  });

  grunt.loadNpmTasks('grunt-contrib-coffee');
  ...
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-concurrent');
  grunt.registerTask('serve', ['coffee', 'develop', 'concurrent:serve']);
  grunt.registerTask('test', ['coffee', 'jasmine_node'/*, 'watch:test'*/]);
  grunt.registerTask('build', ['coffee', 'less']);
  grunt.registerTask('templates', ['copy']);

};


问题:第一次启动服务器后,编辑咖啡文件后,服​​务器抛出错误EADDRINUSE,但该URL仍可访问(因此未关闭第一台服务器)。完整项目:http://github.com/OpenCubes/OpenCubes

[grunt-develop] >
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EADDRINUSE
  at errnoException (net.js:904:11)
  at Server._listen2 (net.js:1042:14)
  at listen (net.js:1064:10)
  at net.js:1146:9
  at dns.js:72:18
  at process._tickCallback (node.js:419:13)

>> application exited with code 8

最佳答案

您指定的行为是预期的。当您启动监视任务时,它将在指定端口上启动服务器。但是,保存时,监视任务会尝试在同一端口上再次启动服务器,但是服务器实例已在该端口上运行。因此,由于端口已在使用中,因此出现EADDRINUSE错误。

当您终止艰苦的任务时,它将终止该进程,其中包括您正在运行的服务器。

要解决您的问题(尽管问题尚不清楚),您需要先终止服务器,然后再在同一端口上启动新服务器。最简单的方法可能是包括一个类似grunt-nodemon的模块或专门用于express的众多模块之一。

另外,如果您需要运行服务器来进行测试,则在使用supertest测试API时,不需要让服务器监听端口。

09-18 15:40