javascript - 使用 koa2 和 koa-router 进行 REST api 获取 204 - 响应正文未传递

标签 javascript rest koa koa-router koa2

我来自 Express,正在尝试为我正在开发的一个新项目学习 Koa2,但我正在努力让最基本的 Get 操作适用于我的应用程序。

在服务器端,我有一个路由设置,用于访问授权服务器 (Etrade),该服务器返回一个 HTML 链接,用户需要使用该链接来授权应用程序。

我可以使用 Postman 来命中路由,并看到我通过 console.log() 调用从 Etrade 返回链接,但它不会在响应正文中返回到 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;

最后是路由的逻辑,减去 key 和 secret 内容:

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

感谢您的帮助和指导!

最佳答案

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

对 et.getRequestToken 的调用不会返回任何内容。当等待触发时,它就会变得未定义。通常我建议使用 es6-promisify但它也不是标准的 Node 接口(interface)(一个回调,带有 err 和 value 参数(非常令人失望!))

也许创建一个如下所示的函数来 Promisify 该函数:

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

然后您可以ctx.body = wait getRequestToken(et)

关于javascript - 使用 koa2 和 koa-router 进行 REST api 获取 204 - 响应正文未传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36721437/

相关文章:

javascript - 电话号码验证按钮不起作用

javascript - 需要一些帮助来使用 Javascript/jQuery 删除 ' € ' 标志

java - 如何确保每个 API 调用都得到服务(排队 Rest API 调用)?

node.js - 科阿的动态路线?

javascript - THREE.js - CameraContros 和camera.up 向量

javascript - 使用 JavaScript 在截止日期前一天触发电子邮件

rest - Azure Site Recovery 保管库的结构名称和保护容器名称是什么

php - 带有 Auth 的 Yii2 CORS 不适用于非 CRUD 操作

javascript - 无法捕获 knex 交易拒绝

javascript - 使用 koa.js + axios 获取错误消息