来自phantomJS的POST调用不会使服务器从咕噜声中运行

这是我的设置。

  • 我有一个咕task任务,做2件事情:1)启动一个HTTP服务器监听某个端口2)触发另一个咕task任务
  • 上面触发的grunt任务是在PhantomJS的test-index.html页面上运行testing的testem任务。
  • test-index.html页面在第一个grunt任务中启动服务器的端口上发送一个POST调用。

问题:POST调用不会打到我的服务器。

注意:如果我手动运行同一个服务器(不是从grunt)然后运行testinggrunt任务,POST调用命中服务器。

这里是代码:

咕task任务

 grunt.registerMultiTask('coverage', 'Generates coverage reports for JS using Istanbul', function () { var server = http.createServer(function(req, resp) { resp.setHeader("Access-Control-Allow-Origin", "*"); console.log('Got something'); req.pipe(fs.createWriteStream('coverage.json')) resp.end(); }); var port = 7358; server.listen(port); // This task simply executes a command: `testem.js ci` grunt.task.run('testem').then(function() { server.close(); }); }); 

test-index.html(在某处)

 function onTestemLoad() { Testem.on('all-test-results', function(results){ var xhr = new XMLHttpRequest(); xhr.open('POST', 'http://localhost:7358/'); xhr.send(JSON.stringify(window.__coverage__)) }); } 

任何人都可以指出什么可能会出错吗?

你被grunt.task.run误导了! 这行不会运行任务,它只是把它放在当前任务完成后运行的任务列表的顶部( http://gruntjs.com/api/grunt.task#grunt.task.run )。

第二个问题是,当一个任务完成时,它将其所有正在运行的进程closures。

那么会发生什么呢?

  1. coverage开始,在您的服务器上旋转,然后将testem注册为下一个任务
  2. coverage结束,取下你的服务器
  3. 下一个任务(= testem )运行,但没有服务器在这里回答…

你可以通过做以下两件事来解决它:

  • 内联你的testing:用一个直接调用testemreplacegrunt.task.run('testem')
  • 确保你的testing同步运行 – 或者保持你的任务活着,直到你的testing完成(使用this.async – 见http://gruntjs.com/api/inside-tasks#this.async )。