2016-10-04 1 views
1

können Sie mir sagen, wie ich meine JSON API bekommen kann?express app.get ('/ *') und api CORs Problem

server.js

app.get('/*', function(req, res) { 
    res.sendFile(path.join(__dirname, 'public', 'index.html')); 
}) 

app.get('/api', function(req, res) { 
    res.header() 
res.json({'message' : 'hi this is my json obj'}); 
}) 

App.js

class App extends React.Component { 
    componentDidMount() { 
    // let foo; 
    axios.get('http://localhost:3000/api') 
     .then(res => { 
     console.log(res.data); 
     res.data.message; 
    }) 
    .catch(err => { 
     console.log(err); 
    }) 
    } 

Aus irgendeinem Grund, wie, dass ich Router localhost den Zugriff reagieren zu erreichen: 3000/Armaturenbrett ganz gut durch das URL-Feld inputing. Es wird immer HTML-String zurückgegeben. was kann ich ändern, um es so zu machen, dass ich json objekt statt html string empfangen kann?

+0

was ist zurück und sicher, dass es eine Anfrage an Ihre Route senden wird –

+1

Es trifft 'app.get ('/ *'' vor 'app.get ('/ api'', vertauscht die Routen Orte – adeneo

+0

was html String es tatsächlich zurückgibt? –

Antwort

1

Sie haben Cors Problem, weil Sie versuchen, die Daten von dieser URL http://localhost:3000/api abrufen, und das ist ganz normal. Die Sache ist, dass, wenn Sie Ihre Anwendung von einem anderen Server bedienen (nehmen wir Port 80 für Apache) ist es normal, dass Sie auch das Kors Problem haben.

Eine Möglichkeit, dies zu umgehen, ist durch eine Middleware-Registrierung vor allen Routen Registrierung:

app.use(function (req, res, next) { 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
    next(); 
}); 

app.get('/*', function (req, res) { 
    res.sendFile(path.join(__dirname, 'public', 'index.html')); 
}) 

app.get('/api', function (req, res) { 
    res.header() 
    res.json({ 'message': 'hi this is my json obj' }); 
}) 

Statt Ihre eigene Middle schaffen Sie das cors Modul verwenden können, und registrieren Sie es wie folgt aus:

var cors = require('cors'); 
app.use(cors()); 

bewusst sein, dass so etwas zu tun:

res.header("Access-Control-Allow-Origin", "*"); 

sein kann Ein bisschen gefährlich für Ihren Server, weil andere Anwendungen Ihre API ohne Probleme direkt vom Browser aus benutzen können. Es gibt einen Grund, dass Kors vorhanden ist und ich würde vorschlagen, darüber zu studieren.

EDIT

By the way, wenn Sie Ihre api dienen und Ihre reagieren Anwendung von demselben Knoten Server dann nur durch diese ersetzt ein:

axios.get('http://localhost:3000/api') 

mit dieser:

axios.get('/api') 

sollte funktionieren

+0

Danke für die Tipps !!! – DevBear15

+0

@ DevBear15 Wenn dies Ihr Problem gelöst hat, in Betracht ziehen, die Antwort zu akzeptieren :) –

1

Sie müssen die Reihenfolge der Route Erklärung wechseln:

app.get('/api', function(req, res) { 
    res.header() 
    res.json({'message' : 'hi this is my json obj'}); 
}) 

app.get('/*', function(req, res) { 
    res.sendFile(path.join(__dirname, 'public', 'index.html')); 
}) 

Das ist, weil /* wird auch Spiel /api und Express basiert nicht überein, auf der Strecke besten passt, aber die Route übereinstimmt erste.

Immer spezifischere Routen vor weniger spezifischen Routen angeben.

+0

Vielen Dank für die schnelle Antwort. Ich bin nur neugierig, könnten Sie erklären, warum die Reihenfolge zwischen diesen beiden Routen wichtig ist? – DevBear15

+0

@ DevBear15 die Route '/ *' ist sehr generisch, es wird grundsätzlich jede Anfrage, _including_ Anfragen für '/ api'. Da Express die Routen in der Reihenfolge ihrer Deklaration prüft, wenn Sie die '/ *' Route vor der '/ api' Route deklarieren, wird die erste Route nach Anfragen nach'/api' passen und die Antwort bekommen (durch Senden einer HTML-Datei und nicht des JSON-Inhalts). – robertklep

Verwandte Themen