首页 > 解决方案 > 节点快速路由中的 HTTPS 请求

问题描述

我试图在 node express 的路由中获取 https 请求的结果,但它失败了,原因是:连接 ETIMEOUT。任何想法我错了?

router.get("/", async (req, res) => {
  try {
    result = await https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY');
    console.log(result);
    res.send(result);
  }
  catch (err) {
    console.log(err);
  }
});

编辑: URL 是有效的,并且在粘贴到浏览器中时会返回一些内容,

我的 API 中的其他端点工作正常,但他们没有 http 请求的想法。它们看起来像这样,即:

router.get("/", (req, res) => {
  try {
    res.sendFile("\\\\abc.local\\a$\\b$\\xyz\\001-005-877.pdf");
  }
  catch (err) {
    res.status(500).json({ err: err.toString() });
  }
});

编辑: 为了完成:我在我的 index.js/ 路由 (app.use("/test", require("./routes/test")); 中有一个错字,这导致了超时。然后使用了这段代码:

router.get("/", (req, res) => {
  request('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', function (error, response, body) {
    console.log('error:', error);
    console.log('statusCode:', response && response.statusCode);
    console.log('body:', body);
  })
});

我使用了模块“请求”。正如Dijkstra建议的那样,即使他的代码(用于表达默认的 http 请求)对我不起作用,他仍然提供了解决问题所需的一切,所以谢谢。

标签: node.jsexpressrouteshttp-get

解决方案


我相信这不是https.get()工作方式。文档在这里

可能的实现:

router.get("/", async (req, res) => {
  https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (result) => {
    console.log('statusCode:', res.statusCode);
    console.log('headers:', res.headers);

    const data = '';
    result.on('data', function (chunk) {
      body += chunk;
    });

    result.on('end', () => {
      res.send(JSON.parse(data));
    });
  }).on('error', (e) => {
    console.error(e);
  });
});

这是执行此类典型任务的非常复杂的代码。这就是为什么有流行的包来处理幕后所有复杂部分的原因。我更喜欢使用Request


推荐阅读