使用https本机模块和express获取失败时发送自定义响应

时间:2020-09-04 21:56:07

标签: javascript node.js express

我有一个Express应用程序,并且在其中有一个对API的HTTP GET请求。 当没有错误时,它运行良好,但是当出现故障时,我想通过Express向客户端发送自定义响应:

const https = require('https');

// more code: init express, middlewares, etc

app.get('/my-endpoint', async (req, res) => {

  https.get('https://my-api.com', (resp) => {
    let data = '';

    resp.on('data', (chunk) => {
      data += chunk;
    });

    resp.on('end', () => {
      console.log(JSON.parse(data));
      res.send({ data: JSON.parse(data) })
    });

  }).on("error", (err) => {
    console.log("Error: " + err.message);
    res.send({ data: 'Something went wrong' })
  });

});

问题在于,总是发送res.send({ data: JSON.parse(data) })解析为的内容,当它起作用时为对象数组,否则为空对象{}。如果请求失败,我将无法发送'Something went wrong'

我将感谢您的帮助。我正在学习。

1 个答案:

答案 0 :(得分:0)

在您的示例中,当您调用https://my-api.com时,服务器响应为200,并返回HTML。

错误发生在JSON.parse(data)中,并且不会进入on("error", ...)部分。

您可以像这样捕获此错误:

resp.on("end", () => {
  try {
    console.log(JSON.parse(data));
    res.send({ data: JSON.parse(data) });
  } catch (e) {
    res.send({ data: "Something went wrong" });
  }
});

否则,您的代码可以正常工作,并且在非200响应时返回{ data: 'Something went wrong' }