在我的 ExpressJS 应用程序中使用 axios 开机自检会给我"Cannot set headers after they are sent to the client"错误



我有一个简单的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/linksPOST中间向第三方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,但仍然会出现同样的错误。我做错了什么?

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

由于回调,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((吗?

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

相关内容

最新更新