Как исправить Невозможно установить заголовки после их отправки клиенту? - PullRequest
0 голосов
/ 15 апреля 2019

После прочтения этой темы в течение последних 2,5 часов я не могу определить, как исправить мою: Невозможно установить заголовки после того, как они отправлены клиентской проблеме, но я думаю, что это связано с приведенным ниже кодом, особеннокод выделен жирным шрифтом.

Любая помощь или помощь будет принята с благодарностью.

app.post("/api/tracking/retrieve", (req, res) => {

res.setHeader('Content-Type', 'application/json'); 
// before all the iterations

    const trackingCodes = ['EZ6000000006', 'EZ4000000004'];
    const carrierCodes = ['UPS', 'UPS'];

    trackingCodes.forEach((trackingCode) => {
        carrierCodes.forEach((carrierCode) => {
            const tracker = new api.Tracker({
                tracking_code: trackingCode,
                carrier: carrierCode
            })

            tracker.save().then(function (data) {

                table = 'tracking_table';
                col = ['user_id', 'tracking_number'];
                val = [user_id, tracker.tracking_code];

            **// !ISSUE: :: ::: :::: ::::: :::::: ::::::: //**

                main.create(table, col, val, function (data) {
                      res.send(JSON.stringify({
                        id: "",
                        user_id: user_id,
                        tracking_number: data.tracking_code
                    })); // replace this for your res.json()
                });
            }

            )
                .catch(error => {
                    // handle errors
                    console.log('There has been an error with your submission.')
                });
        })
    })
res.end()
});

Ответы [ 2 ]

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

Как ответил @kiran Mathew, res.json () вызывается снова и снова внутри цикла for, поэтому «невозможно установить заголовки после отправки ответа».

У вас может быть результирующий массив ' trackingNumbers ' для хранения всех номеров отслеживания и последующего выхода из цикла и отправки одного ответа.

app.post("/api/tracking/retrieve", (req, res) => {
const trackingCodes = ["EZ6000000006", "EZ4000000004"];
  const carrierCodes = ["UPS", "UPS"];
  const trackingNumbers = [];

  trackingCodes.forEach(trackingCode => {
    carrierCodes.forEach(carrierCode => {
      const tracker = new api.Tracker({
        tracking_code: trackingCode,
        carrier: carrierCode
      });

      tracker
        .save()
        .then(function(data) {
          table = "tracking_table";
          col = ["user_id", "tracking_number"];
          val = [user_id, tracker.tracking_code];

          // !ISSUE: :: ::: :::: ::::: :::::: ::::::: //**

          main.create(table, col, val, function(data) {
            // res.json({
            //   id: "",
            //   user_id: user_id,
            //   tracking_number: data.tracking_code
            // });

            trackingNumbers.push(data.tracking_code);
          });
        })
        .catch(error => {
          // handle errors
          console.log("There has been an error with your submission.");
        });

      res.json({
        id: "",
        user_id: user_id,
        tracking_number: trackingNumbers
      });
    });
  });
});
0 голосов
/ 15 апреля 2019

Проблема с вашим кодом заключается в том, что вы вызываете res.json () в итеративном цикле.

Вы должны звонить только один раз, так как

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

Вам лучше писать ответы, используя

res.setHeader('Content-Type', 'application/json'); // before all the iterations
res.send(JSON.stringify({key:"value"})); // replace this for your res.json()
res.end() // after iterations
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...