Ошибка: невозможно установить заголовки после их отправки. в nodejs - PullRequest
1 голос
/ 01 июня 2019

Я сталкиваюсь с ошибкой, показанной ниже в моем приложении, строка 413 указывает на «res.json(stat); // return in JSON format.» в приведенном ниже коде, я просматривал другие сообщения с похожей ошибкой, но ни одна не помогла мне, почему я нажимаю эту ошибку? руководство как это исправить?

app.post('/api/botjobs.json', function(req, res) {
    // console.log(req.body)
    data = req.body;
    var temp = {};
    temp.radar = data.radar;
    temp.request = data.request;
    if(temp.request == 'cloneradar'){
        temp['params.clonetype'] = data.params.clonetype;
    }
    now = new Date();
    data["updated"] = now;      
    // console.log('DATA:')
    // console.log(data)
    // console.log('TEMP:')
    // console.log(temp)
    botjobs.findOne(temp, {}, { sort:{'_id': -1}}, function(err, findstat){
        // console.log(findstat)
        // console.log(err)
        // console.log("inside botjobs findOne");
        if(findstat != null){
            // console.log('updating entry')
            //console.log(findstat);
            data['numupdated'] = findstat['numupdated']+1;
            // console.log(data);
            botjobs.update({'_id':findstat['_id']},data,{ upsert : true, multi: true },function(err,stat){
                if (err)
                    res.send(err);

                res.json(stat); // return in JSON format
            });

        }
        else{
            // console.log('creating new entry')
            data["created"] = now;
            data['numupdated'] = 0;
            botjobs.create(data,function(err, stat) {
                // console.log(stat);
                // if there is an error retrieving, send the error. nothing after res.send(err) will execute
                if (err)
                    res.send(err);

                res.json(stat); // return in JSON format. —> line 413 in route.js
            });
        }

    });

});

Ошибка: -

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:350:11)
    at ServerResponse.res.setHeader (/app/node_modules/express/node_modules/connect/lib/patch.js:134:22)
    at ServerResponse.res.set.res.header (/app/node_modules/express/lib/response.js:595:10)
    at ServerResponse.res.send (/app/node_modules/express/lib/response.js:151:12)
    at ServerResponse.res.json (/app/node_modules/express/lib/response.js:237:15)
    at /app/app/routes.js:413:10

Ответы [ 3 ]

1 голос
/ 01 июня 2019

Вы можете добавить условие, подобное этому

if (err)
{
 res.send(err);
}
else
{
 res.json(stat);
}
0 голосов
/ 01 июня 2019

«Невозможно установить заголовки после их отправки», эта ошибка возникает, когда вы пытаетесь что-то отправить, когда ответ уже отправлен.res.send() завершает ответ, поэтому вы не можете отправлять что-либо после res.send().Почему вы получаете эту ошибку, потому что вызов обновления может возвращать ошибку и, следовательно, вызывается res.send(), который находится внутри блока if.Чтобы избежать ошибки «невозможно установить заголовки» в вашем случае, вам нужно заключить в блок if-else, например:

if (err){
 res.send(err);
}else{
 res.json(stat);
}

Это решит проблему с заголовками набора косяков, но ваш код все равно может завершиться ошибкойпотому что я думаю, что ваш метод обновления не работает.

0 голосов
/ 01 июня 2019

попробуйте return res.send(err); вместо res.send(err); для каждого res.send()

...