【问题标题】:Cannot GET from Express.js PUT route, why?无法从 Express.js PUT 路由获取,为什么?
【发布时间】:2020-01-11 20:08:58
【问题描述】:

您是否有任何原因无法从 Express.js router.put() 中执行 GET 请求?

我有两条路线。完全相同的 api 调用在 router.get() 路由中工作,并在 router.put() 中挂起。

我已经确认了

这行得通:

router.get('/:id', async (req, res) => {
  const { headers } = req;
  let result;
  try {
    result = await axios({ method:'get', url: '/some-url', headers });
  } catch(error) {
    res.status(500).send(new Error('myError');
  }
  res.send({ result });
});

这不起作用:

router.put('/:id', async (req, res) => {
  const { headers } = req;
  let result;
  let finalResult;

  try {
    result = await axios({ method:'get', url: '/some-url', headers });
  } catch(error) {
    res.status(500).send(new Error('myError');
  }

  // logic based on the result of the above GET determines what the value of `finalResult`
  finalResult = { some: 'data' };

  res.send({ finalResult });
});

尽管axios({ method:'get', url: '/some-url' }) 在两条路线中完全相同,但它在一条路线中有效,在另一条路线中无效。

router.put() 路由总是挂了很长时间,最终 Node 输出: Error: socket hang up, code: 'ECONNRESET', etc...

感谢您的帮助,我花了一天多的时间来解决这个问题。

【问题讨论】:

  • Express 中的put 请求处理程序是否被调用?如果是这样,它会走多远?如果它卡在 axios 调用上,你能告诉我们那个 axios 调用的实际代码吗?您是否单独测试了特定的 axios 调用?
  • 是的,它到达了那个路由,并且能够进行它需要的所有其他 axios 调用。是的,我已经单独对其进行了测试,因为我指出该调用在 router.get() 回调中工作。我无法共享该代码的代码,因为它包含有关公司系统的许多细节,但它与我在示例中显示的几乎相同。
  • 好吧,我不知道您希望我们在这里能做什么,而无需查看实际代码或能够自己运行并调试它。
  • @jaimefps 签名不应该是async (req, res) ...你怎么能在不抛出异常的情况下做到res.send
  • 顺便说一句,尝试学习如何调试代码...启动 VSCode 并在本地运行时附加该进程,然后只需添加一个断点并使用 PUT 作为动词命中该端点...

标签: node.js express axios crud


【解决方案1】:

不,快递中没有这样的东西。尝试从邮递员或 curl 发出 GET 请求,看看是否有响应。根本原因可能是您尝试发出的 get 请求无效,或者您发出 GET 请求的服务器可能已关闭。您可以运行以下验证

app.put('/',async (req, res) => {
    let response  = await axios.get('https://google.co.in');
    console.log(response.data);
    res.send({"works": "hello"});
});

【讨论】:

  • 我已经尝试直接从浏览器和 POSTMAN 访问该 GET 端点,并且一切都适用于该 GET 请求。它仅在从 router.put() 回调内部尝试时失败并挂起。
  • 在什么类型的 api 上,您尝试发出 GET 请求。如果它是任何公共 api 或如果它是内部 api,请分享详细信息,看看您是否启用了任何检查
【解决方案2】:

我的问题的根本原因:

http 标头有一个 Content-Length 键,它阻止了 GET 调用正确解析。

由于这些 api 调用发生在 router.put() 回调中,因此标头有一个 Content-Length 指向被 PUT 开始的有效负载“主体”的大小。

解决方案:

在 router.put() 中执行 GET 时,从我的 Headers 中删除 Content-Length 字段,这样 GET 将拥有除 Content-Length 之外的所有其他 Headers 数据

不幸的是,NodeJS 刚刚抛出了 Error: socket hang up 消息,该消息并不能很好地描述潜在问题。

【讨论】:

    猜你喜欢
    • 2018-03-03
    • 2012-03-17
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多