繁体   English   中英

在我的 ExpressJS 应用程序中使用 axios 进行 POST 给我“发送到客户端后无法设置标头”错误

[英]Using axios to POST within my ExpressJS app is giving me "Cannot set headers after they are sent to the client" error

我有一个简单的 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 路由中使用它时,我收到错误[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the clientres.json()[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 我试过去掉 axios 并改用普通的https ,但我仍然遇到同样的错误。 我究竟做错了什么?

由于回调, 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。 但我假设你这样做。 查看此线程以获取更多信息: 我需要在 res.send() 之后调用 next() 吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM