MohanRaj Balumuri
MohanRaj Balumuri

Reputation: 223

Grunt start Node Server and then open browser

I have grunt task that starts the server:

module.exports = function(grunt){ 
  grunt.registerMultiTask('connect', 'Run a simple Node Server', function(){
    var options = this.options();
    // Tell Grunt this task is asynchronous.
    var done = this.async();
    var server = connect();
    server.use(function(request, response, nxt){
      ...
    });
    server.listen(port);
  });
};

Now I want to use grunt to start this node server first and then open the browser using grunt-open plugin.

grunt.task.run(['startServer', 'open']);

But startServer task in blocking the open task as the server keeps on listening. What should I do to keep this node server running and open the browser once the server starts?

Upvotes: 0

Views: 1516

Answers (2)

Artan
Artan

Reputation: 91

I had the same problem as yours and I worked in Windows environment. My solution was to put the web server codes in a file for example myServer.js, and use cmd: "start node \"path\to\myServer.js" within the grunt-exec settings.

Example:

Let's assume my server file is located on the following path: D:\SourceCodes\WebServer\myServer.js

ip address and port of my server is 192.168.1.1:8080,

and my webpage is index.html

Then the Gruntfile.js would be:

module.exports = function (grunt) {
    grunt.initConfig({
       exec: {
           run_server:{
               cwd: "D:/SourceCodes/WebServer/",
               cmd: "start node \"D:/SourceCodes/WebServer/myServer.js\""
           },
           open_web:{                
               cmd: "start chrome http://192.168.1.1:8080/index.html"
           }
    });

    grunt.loadNpmTasks('grunt-exec');
    grunt.registerTask('default', ['exec']);
}

Upvotes: 1

Xavier Priour
Xavier Priour

Reputation: 2121

Two things:

  1. your 'connect' task currently blocks while waiting, you have to tell it to let the grunt process run asynchronously: call done() at the end

    ...
        server.listen(port);
        done();
    });
    
  2. now your build will end at the end of your task list, and take down your server with it. So you have to add a task to keep it alive. I suggest using grunt-contrib-watch, but you may choose any one you like, as long as it's a blocking task:

    grunt.task.run(['startServer', 'open', 'watch]);
    

By the way, why are you calling grunt.task.run instead of defining your own task sequence grunt.registerTask('default', ['startServer', 'open', 'watch]); ?

Upvotes: 0

Related Questions