首页 > 解决方案 > 无法获取对象值并在类中定义常量和静态变量

问题描述

我有以下代码:

'use strict';

const Request = require('request');

class CryptoKetHandlers {

    static async coins(ctx) {
        try {
            var CONTENT_TYPE = 'application/json';
            console.log(`## Hitting cryptoket coins api for coins list ...`);
            var res = await Request.get({
                url: 'https://api.cryptoket.io/info/currencies',
                headers: {
                    'Content-Type': CONTENT_TYPE,
                }
            }, (err, res, body) => {
                //console.log(`Inside response ... res: ${res} err: ${err} body: ${body}`);
                if (err) {
                    console.log(`#### ERROR :: API RESP :: CryptoKetHandlers :: coins :: exception :: ${err}`);
                    ctx.throw(500);
                } else {
                    let res = {};
                    res.body = body;
                    res.status = 200;
                    return res;
                }
            });
        } catch (ex) {
            console.log(`#### ERROR :: CryptoKetHandlers :: coins :: exception :: ${ex}`);
            ctx.throw(500);
        }
        console.log(`######### Final Response :: status - ${res.status} body - ${res.body} res :: ${res}`);
        ctx.body = res;
        ctx.status = 200;
    }

}

module.exports = CryptoKetHandlers;

我来自 Java 背景,是 koa 和 nodejs 的新手,所以想知道如何才能实现以下目标:

  1. 为什么 res.status 和 res.body 总是返回 undefined?
  2. 如何将 CONTENT_TYPE 声明为类变量应该是 const & static?

想要达到的是:

我通过谷歌搜索尝试了各种方法,但没有成功,所以在这里问。

提前致谢。

标签: javascriptjquerynode.jsecmascript-6koa

解决方案


  1. 为什么 res.status 和 res.body 总是返回 undefined?

首先,Request.get()应该返回一个Promise工作为await工作。

await 表达式导致异步函数执行暂停,直到 Promise 被解决,即被履行或拒绝,并在履行后恢复异步函数的执行。恢复时,await 表达式的值是已实现的 Promise 的值。

其次,您不小心将返回值res替换res(err, res, body) => {}. 相反,我们可以将返回值作为普通对象返回。

做出这些改变,

'use strict';

let request = require('request');

const CONTENT_TYPE = 'application/json';

function makeRequest() {
  return new Promise((resolve, reject) => {
    request.get({
      url: 'https://api.cryptoket.io/info/currencies',
      headers: {
        'Content-Type': CONTENT_TYPE,
      }
    }, (err, res, body) => {
      if (err) {
        console.log(`#### ERROR :: API RESP :: CryptoKetHandlers :: coins :: exception :: ${err}`);
        return reject(err);
      }

      // return as object
      return resolve({ 
        body: body,
        status: 200
      });
    });
  });
}

class CryptoKetHandlers {

  static async coins(ctx) {
    try {
      console.log(`## Hitting cryptoket coins api for coins list ...`);
      let res = await makeRequest();
      console.log(`######### Final Response :: status - ${res.status} body - ${res.body} res :: ${res}`);
    } catch (ex) {
      console.log(`#### ERROR :: CryptoKetHandlers :: coins :: exception :: ${ex}`);
    }
  }

}

由于我替换varlet. 我已经在try块内移动了最终的日志记录。

  1. 如何将 CONTENT_TYPE 声明为类变量应该是 const & static?

目前正在对此提出建议。您可以查看ES6 类变量替代项以获取更多信息。


推荐阅读