如何调试对Node.js Express应用程序的POST请求?

时间:2019-04-17 17:24:55

标签: javascript node.js api post

我是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请求中得到响应。

谢谢

1 个答案:

答案 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来解决此问题!