我有以下代码:
'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,所以想知道如何实现以下目标:
想要实现的是:
从Request.get和
返回所有这些err,res,body参数
在其他地方处理它(在另一个类函数中)。
我通过谷歌搜索尝试了各种方法,但没有成功,因此在这里提问。
谢谢。
答案 0 :(得分:0)
- 为什么res.status和res.body总是返回未定义?
首先,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
块中。
- 如何声明CONTENT_TYPE作为类变量应该是const&static?
有关此提案的提议正在进行中。您可以检查ES6 class variable alternatives了解更多信息。