这是我的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时,不需要让服务器监听端口。