2016-04-24 13 views
0

Ich habe eine REST API eingerichtet mit Koa und Koa-Router. Ich kann einen API-Endpunkt und console.log(ctx.body) treffen und ich sehe was ich will und erwarte zu sehen. In diesem Fall erwarte ich, dass mit einer URL ein JSON-Objekt zu sehen, und das ist, was ich auf der Knotenseite zu sehen, wenn ich es tröste out:Wie sende ich eine GET-Antwort von REST api an einen Reactive-Client mit Koa2 und koa-router?

etrade_api: { oauth_token: 'hidden', 
oauth_token_secret: 'hidden', 
authorizeUrl: 'https://us.etrade.com/e/t/etws/authorize?key=hidden&token=hidden' } 

aber wenn ich versuche, den Endpunkt in verbrauchen Reagieren die Antwort, die ich bin auf dem Client immer ein Response-Objekt, das wie folgt aussieht:

Response {url: "http://localhost:3000/api/verification", status: 200, statusText: "OK", headers: Headers, ok: true…} 
_abort:false 
_raw:Array[0] 
body:PassThrough 
bodyUsed:false 
headers:Headers 
ok:true 
size:0 
status:200 
statusText:"OK" 
timeout:0 
url:"http://localhost:3000/api/verification" 
__proto__:Body 

Meine Frage ist, wie kann ich das jSON-Objekt bekomme ich in meinem Knoten console.log auf dem Client oben erwartet?

Ich bin sehr neu in koa und habe versucht, es zu lernen, indem ich den Beispielen anderer Leute folge, wie sie ihre Ruhepis einstellen. Derzeit ist mein Server sieht wie folgt aus:

import Koa from 'koa'; 
import convert from 'koa-convert'; 
import historyApiFallback from 'koa-connect-history-api-fallback'; 
import serve from 'koa-static'; 
import body from 'koa-better-body'; 
import error from 'koa-error'; 
import compress from 'koa-compress'; 
import session from 'koa-session'; 
import responseTime from 'koa-response-time'; 
import logger from 'koa-logger'; 
import config from '../settings/config'; 
import routes from './api/router/routes'; 


const paths = config.utils_paths; 
const app = new Koa(); 

app.keys = ['somethin up in here']; 

app.use(responseTime()); 
app.use(error()); 
app.use(logger()); 
app.use(convert(session(app))); 

// Setup api routes 
app.use(body()); 
routes(app); 

// This rewrites all routes requests to the root /index.html file 
// (ignoring file requests). If you want to implement isomorphic 
// rendering, you'll want to remove this middleware. 
app.use(convert(historyApiFallback({ 
    verbose: false 
}))); 

app.use(convert(serve(paths.client('static')))); 
app.use(compress()); 
app.listen(3000); 

Und meine Routen-Datei sieht wie folgt aus:

import Router from 'koa-router'; 
import account_routes from '../accounts'; //import controllers 

export default function (app) { 
    const router = new Router({ 
     prefix: '/api' 
    }); 

    account_routes(router); 

    app.use(router.routes()); 
    app.use(router.allowedMethods()); 
} 

Schließlich mein Controller sieht wie folgt aus:

import etApi from '../etrade_api'; 

export default function(router){ 
    router.get('/verification', getEtradeVerificationLink); 
    // other routes here 
} 

async function getEtradeVerificationLink(ctx, next) { 
    const myKey = 'hidden'; 
    const mySecret = 'hidden'; 

    try { 
     ctx.body = await etApi.requestToken(myKey, mySecret); 
     console.log('etrade_api:', ctx.body); // this prints out what I expect to see 
    } 
    catch (error) { 
     console.error('Failed to get verification link.', error); 
    } 
} 

Vielen Dank für eine Aufnahme sieh dir das an und hilf ihm, dir zu helfen.

+0

Haben Sie 'cur -i http: // localhost: 3000/api/verification' von der Befehlszeile aus versucht? Auf diese Weise können Sie bestätigen, dass Ihr Server die Ursache des Fehlers ist. – pe8ter

+0

Niemals zuvor Curl verwendet, aber es installiert und den Befehl angewendet. Sieht aus wie die API funktioniert. Ich habe die Header und ein Objekt mit den Schlüsseln und Daten, die ich erwartet hatte, zurückbekommen. Überschriften zeigen: HTTP/1.1 200 OK Content-Type: application/json; charset = utf-8 X-Response-Time: 306ms Content-Length: 280 Datum: Anschluss heute : keep-alive {hier mein erwartetes Objekt} – Zigrivers

+0

wie Koa-Sounds ist dann eher das nicht das Problem, clientseitiger Code, der die API aufruft – pe8ter

Antwort

0

@ Pe8ter brachte mich auf den richtigen Weg. Es stellte sich heraus, dass es keinen Problem mit meinem serverseitigen Code gab, es war mein clientseitiger Code. Ich habe fetch verwendet, um die API zu konsumieren, aber ich habe das Versprechen nicht eingehalten, dass der Abruf korrekt zurückkehrt. Alles, was ich tun musste, war meine Client-Seite Code aus dieser Änderung:

export function fetchVerificationLink() { 
    return async(dispatch) => { 
     dispatch(requestVerificationLink()); 

     let response, link; 
     try { 
      response = await read(urls.etradeVerification); // I have a wrapper around node-fetch, but failed to handle the promise that fetch returns 

      dispatch(receiveVerificationLink(response)); 
     } 
     catch (error) { 
      console.error('Unable to get verification link from eTrade.', error); 
     } 
    } 
} 

Ich änderte dazu den Code die Antwort holen zu handhaben:

export function fetchVerificationLink() { 
    return async(dispatch) => { 
     dispatch(requestVerificationLink()); 

     let response, link; 
     try { 
      response = await read(urls.etradeVerification); 
      try { 
       link = await response.json(); // Here was the solution to my problem. 
       dispatch(receiveVerificationLink(link)); 
      } 
      catch (error) { 
       console.error('Unable to parse authorization link response.', error); 
      }     
     } 
     catch (error) { 
      console.error('Unable to get verification link from eTrade.', error); 
     } 
    } 
} 

Und jetzt alles funktioniert wie erwartet. Danke für die Hilfe!