我是nodejs的新手,我正在使用express将当前的API从python迁移到nodejs。
我想做的是向外部API发出请求。我非常确定我的API调用正确,因为我是从外部API示例中复制的:
exports.getBalance = function() {
return new Promise(function(resolve, reject) {
var command_url = "/v1/transaction/getBalance";
var full_url = API_URL + command_url;
var nonce = getNonce();
var data = "username=" + convertUsername(API_USER) + "&nonce=" + nonce;
const signature = makeSignature(nonce, data, command_url);
var form = {
username: API_USER,
nonce: nonce
};
var formData = querystring.stringify(form);
var contentLength = formData.length;
var headers = {
"X-API-KEY": API_KEY,
"X-API-SIGN": signature,
"X-API-NONCE": nonce,
"Content-Length": contentLength,
"Content-Type": "application/x-www-form-urlencoded"
};
request(
{
url: full_url,
method: "POST",
headers: headers,
body: formData
},
function(error, response, body) {
if (!error) {
body = JSON.parse(body);
if (response.statusCode == 200) {
resolve(body);
} else {
reject(error);
}
} else {
console.log("error:", error);
reject(error);
}
}
);
});
这是我的快速路线:
routes.post("/balance", mistertango.getBalance);
但是,当我尝试发布到该路由时,我什么也没收到。我使用Insomnia来运行API测试,因此Insomnia可以继续运行,而我的Express API没有任何响应。
我想知道如何调试我的代码?我想使用Insomnia来对我的Express API进行API调用,并检查是否从外部API请求中得到响应。
谢谢
答案 0 :(得分:0)
mistertango.getBlance
返回Promise
,但express默认情况下不处理promise。您需要致电res.send(data)
才能将响应实际发送给客户端。
routes.post("/balance", async (req, res, next) => {
try {
const balance = await mistertango.getBalance()
res.send({ balance })
} catch (error) {
next(error)
}
})
或者没有异步/等待状态:
routes.post("/balance", (req, res, next) => {
mistertango.getBalance()
.then(balance => res.send({ balance }))
.catch(error => next(error))
})
注释1 :只要res.send(balance)
不是数字,您就可以使用res.send({ balance })
代替balance
。 (响应正文不能是原始数字,因此我将其包装在一个对象中。)
注释2 :在两种情况下,我们都必须使用.catch
或try / catch来处理任何错误,因为express不能自行处理被拒绝的承诺。您可以使用express-promise-router来解决此问题!