无法获取对象值并无法在类

时间:2018-08-17 03:35:32

标签: javascript jquery node.js ecmascript-6 koa

我有以下代码:

'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总是返回未定义?
  2. 如何声明CONTENT_TYPE作为类变量应该是const&static?

想要实现的是:

  • 从Request.get和
    返回所有这些err,res,body参数 在其他地方处理它(在另一个类函数中)。

    • 进行所有可重用的变量类级别,从而无需再次定义。
    • 如果您有一些建议可以使我的代码更健壮和更简洁。

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

谢谢。

1 个答案:

答案 0 :(得分:0)

  
      
  1. 为什么res.status和res.body总是返回未定义?
  2.   

首先,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}`);
    }
  }

}

自从我将var替换为let以来。我已经将最终的日志记录移到了try块中。

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

有关此提案的提议正在进行中。您可以检查ES6 class variable alternatives了解更多信息。