grunt-connect-proxy icon indicating copy to clipboard operation
grunt-connect-proxy copied to clipboard

Proxy broken?

Open JSteunou opened this issue 10 years ago • 14 comments

I tried with a simple gruntfile but never succeed to make it works

/* global module */


module.exports = function(grunt) {

    grunt.initConfig({

        connect: {
            server: {
                options: {
                    hostname: 'localhost',
                    open: true,
                    port: 8080,
                    keepalive: true

                },
                proxies: [
                    {
                        context: '/api',
                        host: 'localhost',
                        port: 8001
                    }
                ]
            }
        }

    });


    grunt.loadNpmTasks('grunt-contrib-connect');
    grunt.loadNpmTasks('grunt-connect-proxy');

    grunt.registerTask('default', [
        'configureProxies:server',
        'connect:server'
    ]);

};

Opening localhost:8080/api I have a Cannot GET /api displayed even if I create a folder api in the folder served under my other server on 8001.

If I create a folder api under the folder of this Gruntfile I have no longer the error... but that's not what I expected.

JSteunou avatar Jun 05 '14 14:06 JSteunou

+1

bekzod avatar Jun 09 '14 19:06 bekzod

PLESE HELP

bekzod avatar Jun 10 '14 10:06 bekzod

If you need serious help go directly with nginx proxy pass.

JSteunou avatar Jun 10 '14 13:06 JSteunou

I am using nginx already, just wanted to switch to grunt and grunt-connect-proxy

bekzod avatar Jun 10 '14 13:06 bekzod

I made a nodejs proxy directly with node http proxy from nodejitsu, you could do the same and create a grunt task from it.

JSteunou avatar Jun 10 '14 13:06 JSteunou

cool thanks

bekzod avatar Jun 10 '14 13:06 bekzod

I ran into similar problem. grunt serve for an Angular app was running on localhost:9000 and I needed to proxy API requests to a Laravel PHP app running on localhost:8000.

Logging from PHP app started with php -S localhost:8000 logs showed "Invalid request (Unexpected EOF)" while I could access localhost:8000 just fine.

Apparently something weird was happening when proxying localhost:9000 to localhost:8000 and I "solved" it by telling PHP app to start up as 127.0.0.1:8000.

Gruntfile.js

connect: { options: { port: 9000, // Change this to '0.0.0.0' to access the server from outside. hostname: 'localhost', livereload: 35729 }, proxies: [{ context: '/_/api', host: 'localhost', port: 8000, ...

Angular client side app with api data proxy

my-machine$ grunt serve ... Running "configureProxies:server" (configureProxies) task Proxy created for: /_/api to localhost:8000 ... Started connect web server on 127.0.0.1:9000. ... Waiting...OK

And on php side:

php -S 127.0.0.1:8000 PHP 5.4.28 Development Server started at Tue Jun 10 23:03:51 2014 Listening on http://127.0.0.1:8000

This solved my problems. Seemed a bit weird, but whatevs.

oh4real avatar Jun 11 '14 04:06 oh4real

I'll give it a try with 127.0.0.1 instead of localhost

JSteunou avatar Jun 11 '14 06:06 JSteunou

Same problem here with this configuration:

            server2: {
                options: {
                    port: 9000,
                },
                proxies: [
                    {
                        context: '/cortex',
                        host: '10.10.2.202',
                        port: 8080,
                        https: false
                    },{
                        context: '/google',
                        host: 'google.com'
                    },{
                        context: '/test',
                        host: 'localhost',
                        port: 12345
                    }]
            }
        grunt.task.run([
            'configureProxies:server2',
            'connect:server2',
            'open',
            'watch'
        ]);

on the terminali i get:

➜  frontend git:(advanced-testing) ✗ grunt remote
Running "remote" task

Running "configureProxies:server2" (configureProxies) task
Proxy created for: /cortex to 10.10.2.202:8080
Proxy created for: /google to google.com:80
Proxy created for: /test to localhost:12345

Running "connect:server2" (connect) task
Started connect web server on http://0.0.0.0:9000

Running "open:server" (open) task

Running "watch" task
Waiting...

Of corse none of the proxies work and i get Cannot GET /[PATH HERE] for all the configured proxies.

vampolo avatar Jul 15 '14 18:07 vampolo

I got it working. Poor documentation is to blame in this case. To get it working u must change the middleware property as said in the (documentation)[https://github.com/drewzboto/grunt-connect-proxy#adding-the-middleware]

vampolo avatar Aug 12 '14 10:08 vampolo

@vampolo Thank you, I will give it a try next time. Weird the middleware is not added automatically.

JSteunou avatar Aug 12 '14 11:08 JSteunou

Like others, I've had trouble getting this plugin to work. It's so much easier to write your own.

Here's one for my current project. Hopefully this will give others a good starting place to work from.

// tasks/server.js
'use strict';

var connect = require('connect');
var httpProxy = require('http-proxy');
var serveStatic = require('serve-static');

var server = connect();
var proxy = httpProxy.createProxyServer({target: 'http://localhost:3000'});
var latentProxyMiddleware = function(req, res) {
  setTimeout(function() {
    proxy.web(req, res);
  }, 500);
};

module.exports = function(grunt) {
  grunt.registerTask('server:build', function() {
    this.async(); // run forever
    server.use(serveStatic(grunt.config('paths.build')));
    server.use('/', latentProxyMiddleware);
    server.listen(8000);
  });

  grunt.registerTask('server:dev', function() {
    this.async(); // run forever
    server.use(serveStatic(grunt.config('paths.scratch')));
    server.use(serveStatic(grunt.config('paths.bower')));
    server.use(serveStatic(grunt.config('paths.app')));
    server.use('/', latentProxyMiddleware);
    server.listen(8000);
  });
};

sidwood avatar Oct 15 '14 09:10 sidwood

Initially, it does not work for me, however, it is more likely a combination of configuration game to do this magic. Below document is so good and simple to save multiple hours for me!

http://www.hierax.org/2014/01/grunt-proxy-setup-for-yeoman.html

While, still you need to be aware that, in middleware configuration, you need to combine the static content with the proxy settings recommended by its document.

then, we will still use same sever to view the angular part, but we can proxy the rest api part to any places we want, either local or remote.

    // The actual grunt server settings
    connect: {
      options: {
        port: 9000,
        // Change this to '0.0.0.0' to access the server from outside.
        hostname: 'localhost',
        livereload: 35729
      },
      proxies: [{
        context: '/api',
        host: 'localhost',
        port: 8008
      }],
      livereload: {
        options: {
          open: true,
          middleware: function (connect, options) {
            var middlewares = [];

            middlewares.push(connect.static('.tmp'));
            middlewares.push(connect().use(
              '/bower_components',
              connect.static('./bower_components')
            ));
            middlewares.push(connect.static(appConfig.app));

            // Setup the proxy
            middlewares.push(require('grunt-connect-proxy/lib/utils').proxyRequest);

            // Serve static files
            options.base.forEach(function(base) {
              middlewares.push(connect.static(base));
            });

            return middlewares;
          }
        }
      }
}

realdah avatar Apr 16 '15 04:04 realdah

I had forgotten to do this which is why wasn't working.

    grunt.registerTask('server', function (target) {
        grunt.task.run([
            'clean:server',
            'compass:server',
            'configureProxies:server',  //This
            'livereload-start',
            'connect:livereload',
            'open',
            'watch'
        ]);
    });

scirelli avatar Sep 22 '16 18:09 scirelli