Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту - экспресс + запрос - PullRequest
1 голос
/ 14 апреля 2019

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

Ниже приведен 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:\Users\GayathriGanesan\Documents\sampleNode\node_modules\express\lib\response.js:767:10)
    at ServerResponse.send (C:\Users\GayathriGanesan\Documents\sampleNode\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\Users\GayathriGanesan\Documents\sampleNode\node_modules\express\lib\response.js:267:15)
    at Request._callback (C:\Users\GayathriGanesan\Documents\sampleNode\app.js:80:34)
    at Request.self.callback (C:\Users\GayathriGanesan\Documents\sampleNode\node_modules\request\request.js:185:22)
    at Request.emit (events.js:189:13)
    at Request.<anonymous> (C:\Users\GayathriGanesan\Documents\sampleNode\node_modules\request\request.js:1161:10)
    at Request.emit (events.js:189:13)
    at IncomingMessage.<anonymous> (C:\Users\GayathriGanesan\Documents\sampleNode\node_modules\request\request.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 Ответ

0 голосов
/ 14 апреля 2019

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

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

response.status(201).json(JSON.parse(body));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...