2014-02-05 12 views
11

Ich möchte den Zugriff ermöglichen, um Ursprungsaufrufe zu kreuzen, die ich in der Lage sein muss, Rest-API-Aufrufe an den Server auszuführen.Grunt connect Task und Middleware Access-Control-Allow-Origin

Mein Grunzen Aufgabe verbinden ist wie folgt konfiguriert:

connect: { 
    options: { 
    port: 9000, 
    // Change this to '0.0.0.0' to access the server from outside. 
    hostname: 'localhost', 
    livereload: 35729, 
    middleware: function(connect, options, next) { 
     return [ 
     function(req, res, next) { 
      res.setHeader('Access-Control-Allow-Origin', '*'); 
      res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
      res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); 
      next(); 
     } 
     ]; 
    } 
    }, 
}, 

Wenn ich das Grunzen Server betreibe ich Cannot GET / bin immer. Ohne die Middleware-Konfiguration funktioniert die App und die Indexdatei wird korrekt geladen.

Können Sie mich zu dem führen, was ich falsch mache oder verpasse?

Einige weitere Details über meine Gruntfile ist, dass ich die yeoman angular seed App als meine Basis für die App verwende.

+2

Ich glaube nicht, dass die Middleware-Funktion ein „next“ Parameter übernimmt. – bpaul

+0

Ja, sollte die Zeile oben sein: Middleware: Funktion (verbinden, Optionen, Middlewares). https://github.com/gruntjs/grunt-contrib-connect#middleware, zweites Beispiel unter Middlewares. – ansorensen

Antwort

5

versuchen, etwas wie folgt aus:

connect: { 
    options: { 
    port: 9000, 
    // Change this to '0.0.0.0' to access the server from outside. 
    hostname: 'localhost', 
    livereload: 35729, 

    // remove next from params 
    middleware: function(connect, options) { 
     return [ 
     function(req, res, next) { 
      res.setHeader('Access-Control-Allow-Origin', '*'); 
      res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
      res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); 

      // don't just call next() return it 
      return next(); 
     }, 

     // add other middlewares here 
     connect.static(require('path').resolve('.')) 

     ]; 
    } 
    }, 
    }, 
+0

Ich habe gerade Ihre Änderung versucht, aber ich bin immer noch nicht in der Lage, die App zum Laufen zu bringen. Etwas mehr Details über meine Gruntfile ist, dass ich die yeoman angular seed App als meine Basis für die App benutze. – shanti

+1

Wenn du yeoman benutzt, solltest du so etwas zu deiner Middleware hinzufügen: '' 'connect.static (require ('path'). Resolve (yeomanConfig.app));' '' – bpaul

+0

hat für mich funktioniert, kein Aufwand. Vielen Dank! – ccnokes

0
connect: { 
    options: { 
    port: 9000, 
    // Change this to '0.0.0.0' to access the server from outside. 
    hostname: 'localhost', 
    livereload: 35729, 
    middleware: function(connect, options, next) { 
     return [ 
     function(req, res, next) { 
     res.header('Access-Control-Allow-Credentials', true); 
     res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
     res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); 
     next(); 
     }]; 
    } 
    }; 

dieser Wille hilft Ihnen bei der immer die erhalten rufen Access-Control-Allow-Credentials

+0

Versuchte die Änderungen, aber immer noch kein Glück .. weiß nicht, was ich falsch mache – shanti

+0

Das obige wird einen Fehler werfen, weil res keine Header-Methode hat. Sie müssen res.setHeader verwenden. – ansorensen

2

Nod bpaul, die mich auf dem Weg auf korrekte Antwort. Das Format einer Antwort auf eine similar question wird hier funktionieren.

Ersetzen ‚next‘ mit Middleware, und drücken Sie Ihre anonyme Funktion in den Middleware-Array vor der Rückgabe:

middleware: function(connect, options, middlewares) { 

    middlewares.unshift(function(req, res, next) { 
     res.setHeader('Access-Control-Allow-Credentials', true); 
     res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
     res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); 
     next(); 
    }); 

    return middlewares; 
} 
+0

Ja, ich mag diese Art, Middleware mehr zu machen. Vielen Dank – bpaul

0

Grunt kommt mit mehreren Middle verbindet als Funktionen in einem Array abgelegt. Wenn Sie Middleware setzen, indem Sie ein Array zurückgeben, überschreiben Sie die vorhandene Middleware, die für die Bereitstellung Ihrer Seiten zuständig ist.

Absorensen Kommentar der Dokumentation, https://github.com/gruntjs/grunt-contrib-connect#middleware der relevante Abschnitt sein.

Middleware früher im Array wird vor diesen später im Array wirksam.

Also, was würden Sie wollen, ist

connect: { 
    options: { 
     port: 9000, 
     // Change this to '0.0.0.0' to access the server from outside. 
     hostname: 'localhost', 
     livereload: 35729, 

     // remove next from params 
     middleware: function(connect, options, middlewares) { 
      middlewares.unshift(function(req, res, next) { 
       res.setHeader('Access-Control-Allow-Origin', '*'); 
       res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
       res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); 

       return next(); 
      }); 

      return middlewares; 
     } 
    }, 
},