Ошибка [ERR_HTTP_HEADERS_SENT]: не удается установить заголовки после их отправки клиенту — Экспресс Запрос

#node.js #express

#node.js #экспресс

Вопрос:

Я понимаю, что это очень простой вопрос, но я трачу слишком много времени, чтобы понять, почему это происходит.

Ниже приведен api, в котором я использую npm request lib для запроса api, и я отправляю ответ с экспресс-ответом. Когда я нажимаю на это, я получаю:

 Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:470:11)
    at ServerResponse.header (C:UsersGayathriGanesanDocumentssampleNodenode_modulesexpresslibresponse.js:767:10)
    at ServerResponse.send (C:UsersGayathriGanesanDocumentssampleNodenode_modulesexpresslibresponse.js:170:12)
    at ServerResponse.json (C:UsersGayathriGanesanDocumentssampleNodenode_modulesexpresslibresponse.js:267:15)
    at Request._callback (C:UsersGayathriGanesanDocumentssampleNodeapp.js:80:34)
    at Request.self.callback (C:UsersGayathriGanesanDocumentssampleNodenode_modulesrequestrequest.js:185:22)
    at Request.emit (events.js:189:13)
    at Request.<anonymous> (C:UsersGayathriGanesanDocumentssampleNodenode_modulesrequestrequest.js:1161:10)
    at Request.emit (events.js:189:13)
    at IncomingMessage.<anonymous> (C:UsersGayathriGanesanDocumentssampleNodenode_modulesrequestrequest.js:1083:12)
 

Ниже приведен код, который был написан.

      var express = require('express');
     var app = express();
     var request=require("request");
    const bodyParser = require('body-parser');
    app.use(bodyParser.json());
     app.use(function(req, res, next) {
            res.header("Access-Control-Allow-Origin", "*");
            res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With,    Content-Type, Accept,clientSecret");
            res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,PATCH,DELETE,OPTIONS');

            next();
      });

      app.post("/push/v1/apps/:appID/devices",function(req,response){
                var appID=req.params.appID;
            var options={
                url:"https://pushapp.sampleapp.net/push/v1/apps/" appID "/devices",
                headers:{
                    'Content-Type':req.headers["content-type"],
                    'clientSecret':req.headers["clientsecret"]
                },
                body: JSON.stringify(req.body)
            }
               request.post(options,function(err,res,body){
                if(res.statusCode==201){  
                    response.sendStatus(201).json(JSON.parse(body));
                }
                else{
                    response.sendStatus(res.statusCode);
                }

            });

            });
 

Не могли бы вы помочь понять, почему. Я мог бы как-то догадаться, что обратный вызов выполняется дважды. Но не уверен, как это сделать.

Ответ №1:

Проблема заключается в том, что res.sendStatus задает заданный код состояния HTTP ответа и отправляет его строковое представление в качестве тела ответа (см. Документацию). res.json установит заголовок ответа типа содержимого, но на момент времени ответ уже будет отправлен клиенту.

Таким образом, вместо использования res.sendStatus вы могли бы просто использовать res.status :

 response.status(201).json(JSON.parse(body));
 

Комментарии:

1. но я наткнулся на тот факт, что статус устарел.

2. Похоже, это не так: github.com/expressjs/express/blob/… Где вы это прочитали?

3. hey..am извини. наверное, я запутался с res.send(статус) . Спасибо за ваши комментарии. это действительно мне очень помогло. Спасибо!

4. Рад, что смог помочь, не забудьте принять ответ 😉