0

私は Express から来て、現在取り組んでいる新しいプロジェクトのために Koa2 を学ぼうとしていますが、アプリで最も基本的な Get 操作を機能させるのに苦労しています。

サーバー側では、ユーザーがアプリを承認するために使用する必要がある HTML リンクを返す承認サーバー (Etrade) にアクセスするルート設定があります。

Postman を使用してルートにアクセスし、呼び出しを介して Etrade からリンクが返されることを確認できますがconsole.log()、応答本文で Postman に返されません。

クライアント アプリに接続すると、応答ステータス コード 204 が返されます。これは、これを正しく理解していれば、応答本文が空であることを意味します。

Koa2 の理解を深めるだけでなく、応答本文を渡す方法を理解する必要があります。

現在、次のようにセットアップserver.jsしています。

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}.`);

router.jsの設定は次のとおりです。

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

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

etradeVerification(api);

export default api;

最後に、鍵と秘密のものを除いたルートのロジック:

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);
}

あなたの助けと指導に感謝します!

4

1 に答える 1

1

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

この et.getRequestToken への呼び出しは何も返しません。await が発生すると、未定義になります。通常はes6-promisifyを使用することをお勧めしますが、これも標準の Node インターフェイスではありません (1 つのコールバック、err および value 引数を使用する (非常に残念です!))。

おそらく、次のような関数を作成して、関数を Promisify します。

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

その後、できますctx.body = await getRequestToken(et)

于 2016-04-20T15:53:58.617 に答える