2016-04-19 16 views
0

Ich komme aus Express und versuche, Koa2 für ein neues Projekt zu lernen, an dem ich arbeite, aber ich habe Mühe, am meisten zu bekommen basic Get Operation funktioniert für meine App.204 mit koa2 und koa-router für REST API - Antwort Körper wird nicht übergeben

Auf der Serverseite habe ich eine Route-Setup, die einen Autorisierungsserver (Etrade) trifft, die einen HTML-Link zurückgibt, den der Benutzer verwenden muss, um die App zu autorisieren.

Ich kann Postman verwenden, um die Route zu schlagen und zu sehen, dass ich die Verbindung zurück von Etrade durch meine console.log() Anruf, aber es kommt nicht zurück zu Postman in der Antwort Körper.

Wenn ich es mit der Client-App verdrahtete, bekomme ich einen Antwortstatuscode von 204, was bedeutet, dass mein Antwortkörper leer ist, wenn ich das richtig verstehe.

Ich muss herausfinden, wie man die Antwort Körper weitergegeben sowie mein Verständnis von Koa2 zu verbessern.

Ich habe gerade mein Setup server.js wie folgt:

import Koa from 'koa'; 
import convert from 'koa-convert'; 
import proxy from 'koa-proxy'; 
import logger from 'koa-logger'; 
import body from 'koa-better-body'; 
import api from '../config/router/router'; 
import historyApiFallback from 'koa-connect-history-api-fallback'; 
import config from '../config/base.config'; 

const port = config.server_port; 
const host = config.server_host; 
const app = new Koa(); 

app.use(logger()); 
app.use(body()); 
app.use(api.routes()); 
app.use(api.allowedMethods()); 

// enable koa-proxyy if it has been enabled in the config 
if (config.proxy && config.proxy.enabled) { 
    app.use(convert(proxy(config.proxy.options))); 
} 

app.use(convert(historyApiFallback({ 
    verbose : false 
}))); 

server.listen(port); 
console.log(`Server is now running at http://${host}:${port}.`); 

Mein router.js Setup ist wie folgt:

import Router from 'koa-router'; 
import etradeVerification from '../../server/api/etrade/verification'; 

const api = new Router({ 
    prefix: '/api' 
}); 

etradeVerification(api); 

export default api; 

Schließlich wird die Logik für die Route, minus der Schlüssel und geheimen Sachen:

import Etrade from 'node-etrade-api'; 

const myKey = ''; 
const mySecret = ''; 
const configuration = { 
    useSandbox : true, 
    key  : myKey, 
    secret  : mySecret 
}; 

const et = new Etrade(configuration); 

export default function(router) { 
    router.get('/etrade', getEtradeUrl); 
} 

async function getEtradeUrl(ctx, next) { 
    // Isn't this how I send the response back to the client? 
    // This isn't coming through as a response body when using Postman or the client app 
    ctx.body = await et.getRequestToken(receiveVerificationUrl, failedToGetUrl); 
} 

function receiveVerificationUrl(url) { 
    console.log(url); // This works and displays the response from etrade 
    return url 
} 

function failedToGetUrl(error) { 
    console.log('Error encountered while attempting to retrieve a request token: ', error); 
} 

Vielen Dank für Ihre Hilfe und Anleitung!

+0

Hallo, ich habe auch ein Problem mit dem Körper, und ich benutze Windows10. Ich konnte keine Lösung für mein Problem finden, das in dieser Frage zitiert wird: http://stackoverflow.com/questions/38856815/koa2-request-body-is-empty. Was ist dein Betriebssystem? –

Antwort

1

ctx.body = erwarten et.getRequestToken (receiveVerificationUrl, failedToGetUrl);

Dieser Aufruf von et.getRequestToken gibt nichts zurück. Wenn Feuer erwartet werden, wird es einfach undefiniert. Normalerweise würde ich mit es6-promisify vorschlagen, aber es ist auch keine Standard-Knoten-Schnittstelle entweder (ein Rückruf, mit einem err und Wertargumenten (Sehr enttäuschend)!)

erstellen Vielleicht eine Funktion wie folgt die Funktion Promisify:

function getRequestToken(et){ 
    return new Promise(function(resolve, reject){ 
     et.getRequestToken(resolve, reject) 
    }) 
} 

Dann können Sie ctx.body = await getRequestToken(et).

+0

Das hat den Trick gemacht! Vielen Dank. Es gab eine Lücke in meinem Verständnis von asynchronen Funktionen. – Zigrivers