Arhn - архитектура программирования

Невозможно установить заголовки после их отправки. Я не вызываю render()/json() дважды

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

Ошибка: невозможно установить заголовки после их отправки.

Я нигде не вызываю response.json() или response.render() дважды для этого ответа. Так почему же возникает эта ошибка?

router.post('/yolo', jsonParser, function(req, res, next) {

    response = res;
    shortUrl = shortenTheUrl(req.body.textBoxValue);
    var insertDataInTableQuery = "INSERT INTO `WinGoku`.`ShortenedUrlsTable` (`OriginalUrl`, `ShortUrl`) VALUES('"+req.body.textBoxValue+ "', '"+ shortUrl +"')";
    runSQLQuery(insertDataInTableQuery, sendResponseToClient);
});

function runSQLQuery(query, callbackFunction) {
    connection.query(query, function(error) {
        if(error) {
            console.log(query);
            console.log("QueryError: "+ error);
            if(callbackFunction != undefined)
                callbackFunction({type: "alert", errorMessage: error});
        }

        if(callbackFunction != undefined)
            callbackFunction({type: "alert", errorMessage: "successful"});
    });
}

function sendResponseToClient(queryExecutionResult) {
    console.log("1: "+ queryExecutionResult["type"] + " 2: "+ queryExecutionResult["errorMessage"]);
    response.json({shortenedUrl: shortUrl, type: queryExecutionResult["type"], message: queryExecutionResult["errorMessage"]});
            ^
            error here. Can't set headers after they are sent
}

  • Когда в runSQLQuery возникает ошибка, обратный вызов будет вызван дважды. Кроме того, ваш код, похоже, подвержен инъекциям SQL. 20.01.2016

Ответы:


1

Возможно, вы вызываете response.json() дважды, если запрос завершается ошибкой и вместо возврата из предложения об ошибке он также выполняет предложение об успешном завершении запроса. Таким образом, вы должны поместить оператор возврата в конце предложения об ошибке. Это должно решить проблему.

function runSQLQuery(query, callbackFunction) {
    connection.query(query, function(error) {
        if(error) {
            console.log(query);
            console.log("QueryError: "+ error);
            if(callbackFunction != undefined)
                callbackFunction({type: "alert", errorMessage: error});

            return; // this should fix the problem!
        }

        if(callbackFunction != undefined)
            callbackFunction({type: "alert", errorMessage: "successful"});
    });
}
20.01.2016
  • Мало того, response является глобальной переменной (!). Даже при отсутствии ошибок могут возникать ситуации, когда response.json() вызывается несколько раз для одного и того же объекта ответа. 20.01.2016

  • 2

    вы не заканчиваете ответ, поэтому возникает ошибка. Попробуйте изменить свой код следующим образом:

    router.post('/yolo', jsonParser, function(req, res, next) {
        response = res;
        shortUrl = shortenTheUrl(req.body.textBoxValue);
        var insertDataInTableQuery = "INSERT INTO `WinGoku`.`ShortenedUrlsTable` (`OriginalUrl`, `ShortUrl`) VALUES('"+req.body.textBoxValue+ "', '"+ shortUrl +"')";
        runSQLQuery(insertDataInTableQuery, sendResponseToClient, function(data){
         res.end();
        });
    });
    
    20.01.2016
  • runSQLQuery() принимает два аргумента, а не три. 20.01.2016
  • добавьте runSQLQuery(query, callbackFunction, Success) {}, а затем проверьте, завершается ли метод. 20.01.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..