【问题标题】:Using axios to POST within my ExpressJS app is giving me "Cannot set headers after they are sent to the client" error在我的 ExpressJS 应用程序中使用 axios POST 给我“发送到客户端后无法设置标题”错误
【发布时间】:2021-02-03 20:30:35
【问题描述】:

我有一个简单的 Express 应用程序,其中包含几条路线。特别是一条路线是 POST 路线。在此 POST 路由中,我尝试向第三方 API 进行 POST,并在我的实际 POST 响应中使用来自此第三方 API 响应的数据。该应用程序如下所示:

const express = require('express');
const axios = require('axios');

const app = express();

...

app.post(
  '/api/links',
  (req, res, next)=> {
    const data = req.body;

    axios.post('https://third.party.api.com/api/v1', data, headers)
      .then(data => res.json(data.data))
      .catch(err => res.send(err));
    next();
  }
)

我定义的 GET 请求有效,但 POST 无效。我正在使用 axios 在/api/links POST 中间向第三方 API 发送 POST。我希望我的端点在成功时从这个第三方 API 返回数据,这就是我拥有res.json(data.data) 的原因。我在 GET 路由中使用 res.json 没有问题,但是当我在 POST 路由中使用它时,我从 res.json() 行收到错误 [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client。我试过去掉 axios 并改用普通的https,但我仍然得到同样的错误。我做错了什么?

【问题讨论】:

    标签: node.js express http axios


    【解决方案1】:

    由于回调,next 将在您返回响应之前被调用(因此后续处理程序将在您从 post 调用返回之前发送响应)。这就是为什么会出现 ERR_HTTP_HEADERS_SENT 错误。

    所以而不是:

    axios.post('https://third.party.api.com/api/v1', data, headers)
      .then(data => res.json(data.data))
      .catch(err => res.send(err));
    next();
    

    这个:

    axios.post('https://third.party.api.com/api/v1', data, headers)
      .then(data => res.json(data.data))
      .then(_=>     next())
      .catch(err => res.send(err));
    

    您可能想查看您的 get 处理程序,看看您在那里实际做了什么。

    如果您没有安装任何后处理中间件,则根本不应该调用 next。但我假设你这样做。查看此线程以获取更多信息:Do I need to call next() after res.send()?

    问题的原因仍然是在 promise 解决之前调用了 next()。

    【讨论】:

    • next 在发送响应时并不经常(曾经?)需要调用......这往往会调用一个 404 处理程序,这也会产生标头错误。
    • 这是不正确的。你永远不想在这里打电话给next()
    • 我不知道,看看这里:stackoverflow.com/questions/40701123/…。你肯定有想要在你的处理程序之后运行的中间件。您只是无法再次写入响应流。
    【解决方案2】:

    删除对next() 的呼叫。这会继续路由并从其他处理程序发送一些其他响应。当您在自己的处理过程中发送响应时,您希望结束路由并且您通过不调用 next() 来完成此操作。

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 2021-11-30
      • 2021-01-25
      • 2019-08-10
      • 1970-01-01
      • 2021-10-25
      • 2021-01-15
      • 2020-05-30
      • 1970-01-01
      相关资源
      最近更新 更多