необходимо res.json () для двух отдельных конечных точек, выдает ошибку заголовков (узел / экспресс) - PullRequest
0 голосов
/ 12 января 2019

У меня проблема с отправкой одного и того же объекта json на две отдельные конечные точки. Мне нужно отправить одну копию в базу данных, а другую копию обратно клиенту. Я получаю can't set headers after they are sent. Я обнаружил ошибку, в которой говорится, что res.json() вызывается один раз и не может быть вызван во второй раз, потому что заголовки были «запечены». Я довольно новичок в разработке, любые предложения или объяснения были бы очень полезны.

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

paypal.payment.execute(paymentId, execute_payment_json, function (error, payment) {
        if (error) {
            console.log(error.response);
            throw error;
        } else {
            console.log("Get Payment Response");
            console.log(JSON.stringify(payment));
                         const userData = {paymentID : payment.id};
            UserData.addUserData(userData, function(err, userData) {
              if (err) {
                throw err;
              }
              res.json(userData);
            });
            res.json(userData)
        }
    });
})

1 Ответ

0 голосов
/ 12 января 2019

Вы правы, когда пишете, что не можете позвонить res.json() во второй раз. Вы можете отправить только один ответ на запрос. res.json() отправляет ответ, поэтому вы можете позвонить только один раз (вы, вероятно, уже видели этот вопрос).

Вам не нужно отправлять ответ в базу данных. Только клиент, отправивший запрос, должен получить ответ. Вызов res.json() ничего не отправит в базу данных. Чтобы сохранить объект userData в базе данных, вы должны вызвать функцию, которая это делает. В вашем случае, я полагаю, вы делаете это с UserData.addUserData(). Именно здесь происходит сохранение, а не отправка ответа на него.

Функция, которую вы отправляете в качестве аргумента UserData.addUserData(), скорее всего, является обратным вызовом, который называется ПОСЛЕ сохранения объекта userData. По сути, UserData.addUserData() сделает все то, что должен, а затем продолжит выполнение функции, которую вы написали после этого. Там вы можете позвонить res.json(). Вы можете удалить последний звонок на res.json(). Это не нужно, поскольку вы будете вызывать его в функции обратного вызова после завершения сохранения в базе данных.

paypal.payment.execute(paymentId, execute_payment_json, function (error, payment) {
        if (error) {
            console.log(error.response);
            throw error;
        } else {
            console.log("Get Payment Response");
            console.log(JSON.stringify(payment));
            const userData = {paymentID : payment.id};
            UserData.addUserData(userData, function(err, userData) {
              if (err) {
                throw err;
              }
              res.json(userData);
            });
        }
    });
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...