NodeJS 错误:标头发送到客户端后无法删除

9udxz4iz  于 2022-11-29  发布在  Node.js
关注(0)|答案(3)|浏览(170)

我正在运行管理员注册和管理员数据检索react应用程序。注册工作正常,但检索管理员数据是粉碎我的后端。我遇到了这个错误时,调用给定的端点从我的react应用程序。但当我调用它从 Postman 它工作得很好。当我看到我的浏览器上的控制台我的react应用程序发送两个调用同时,而不是一个。在这些调用我的应用程序粉碎。如果有人能告诉我如何解决这个问题?对于backend = Node.js with express.js framework对于frontend = React
这是我遇到的错误

node:internal/errors:465
    ErrorCaptureStackTrace(err);
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot remove headers after they are sent to the client    
    at new NodeError (node:internal/errors:372:5)
    at ServerResponse.removeHeader (node:_http_outgoing:654:11)
    at ServerResponse.send (C:\Users\Momentum\Documents\The Technologies\Madudi-App-Api\node_modules\express\lib\response.js:214:10)
    at C:\Users\Momentum\Documents\The Technologies\Madudi-App-Api\api\index.js:22:72
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  code: 'ERR_HTTP_HEADERS_SENT'
}
[nodemon] app crashed - waiting for file changes before starting...

这就是我如何设置我的端点,并将数据更改为字符串,以获得简单的响应,但它崩溃

const makeHttpRequest = (controller, helper) => {

  const makeRequest =  (req, res) => {
    try {
      var data =  "Trying response";
      res.status(200).send({ status: true, data: data });
    } catch (error) {
      console.log(`ERROR: ${error.message}`);
      res.status(400).send({ status: false, error: error.message });
    }
  };
  return { makeRequest };
};

const makeApi = ({router, controller, helper}) => {
    router.get("/test", (req, res) => res.send("Router is Woking..."));
    
    router.get("/admin/get_all_admins", async (req, res) => res.send(await makeHttpRequest(controller, helper).makeRequest(req, res)));
}
 
module.exports = { makeApi }

这是我的react应用程序发出的呼叫

export default  function GetAllUsers() {
 useEffect(() =>{
    try{
        const response =  axios.get('http://localhost:5000/admin/get_all_admins').then(async (response) => {
            console.log('response  ', response)
            return response.data; 
        });
      
    }catch(error) {
        return [];
    }
 }, [])
kmynzznz

kmynzznz1#

我不熟悉这种响应请求的方法,但在我自己看来,当你发送多个响应时,你所面临的错误就会发生。
这可能是JavaScript的异步特性,从而导致在函数完成后发送另一个请求。
你还应该尝试返回响应,这样一旦完成,它就会从函数中取消。

const handler = (req,res) => {
   return res.status(200).json(data)}
r55awzrz

r55awzrz2#

当您尝试为同一个传入请求发送多个响应时(这是不允许的),会发生此特定错误。
您正在为服务器上的同一个请求多次调用res.send()
第一种情况发生在makeRequest()函数中。
第二次发生在这行代码中:

router.get("/admin/get_all_admins", async (req, res) => res.send(await makeHttpRequest(controller, helper).makeRequest(req, res)));

你不能这么做。每个传入的请求都有一个响应。所以,要么用makeRquest()发送响应,而不要在调用程序中发送。要么,不要用makeRequest()发送响应,而只是返回响应应该是什么样的,让调用程序发送它。选择一个模型或另一个模型。

vmdwslir

vmdwslir3#

我不熟悉这种设置服务器的方式。看起来很奇怪。但是,在router.get("/admin/get_all_admins"中,你发送一个响应,它调用一个函数makeHttpRequest,该函数也发送一个响应。因此,你会得到一个错误Cannot remove headers after they are sent to the client,因为你发送了两次响应。

相关问题