Node.js / Firebase: невозможно установить заголовки после их отправки - PullRequest
0 голосов
/ 10 ноября 2018

У нас есть проект express.js / firebase с маршрутом / api / progress POST, который принимает маркер в качестве параметра и увеличивает его, если отсканированный маркер равен текущему прогрессу пользователя в массиве, в котором хранится порядок сюжетов. Для этого у нас есть GET route / api / progress, который возвращает пользовательский прогресс. Мы проверяем, равен ли номер отсканированного маркера storyOrder [userProgress] (минус один из-за индексов массива), прогресс пользователя получается по маршруту api / progress /? User = "user".

Когда Number(marker) === storyOrder[response.data.data]-1, мы увеличиваем прогресс в базе данных firebase на единицу. Однако при запуске кода иногда выдается следующая ошибка:

Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at ServerResponse.header (/Users/user/Documents/projects/project/node_modules/express/lib/response.js:767:10)
at ServerResponse.send (/Users/user/Documents/projects/project/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/Users/user/Documents/projects/project/node_modules/express/lib/response.js:267:15)
at userDB.on.data (file:///Users/user/Documents/projects/project/routes/api.mjs:104:15)
at /Users/user/Documents/projects/project/node_modules/@firebase/database/dist/index.node.cjs.js:4465:22
at exceptionGuard (/Users/user/Documents/projects/project/node_modules/@firebase/database/dist/index.node.cjs.js:691:9)
at EventList.raise (/Users/user/Documents/projects/project/node_modules/@firebase/database/dist/index.node.cjs.js:9727:17)
at EventQueue.raiseQueuedEventsMatchingPredicate_ (/Users/user/Documents/projects/project/node_modules/@firebase/database/dist/index.node.cjs.js:9681:41)

Это код для маршрутов GET и POST / api / progress:

ПОЛУЧИТЬ прогресс:

router.get('/progress', async (req, res, next) => {
let name = req.query.user || null;
console.log('Name: ',name);
let progress;
let dataList;

try {
  const getData = async data => {
    if (data.val()) {
    let tmp = await data.val();
    progress = parseInt(tmp[name].progressCounter);
    console.log(progress);
    // Return progress
    res.json({ status: 200, data: progress });
  } else {
    res.json({ status: 500, err: 'No data! ' });
  }
};

const errData = error => {
  console.error('Something went wrong.');
  console.error(error);
};

dataList = await userDB
  .orderByKey()
  .equalTo(name)
  .on('value', getData, errData);
} catch (err) {
  console.log('Error: ', err.message)
  res.json({ status: 500, err: 'Error while getting progress' });
}

});

Прогресс POST:

router.post('/progress', async (req, res, next) => {
const user = req.session.user;
const marker = req.body.marker;
if (marker!== undefined) {
  const updateProgress = async progress => {
  let updateProg = progress.data;
  updateProg++;
  await userDB.child(user).update({ progressCounter: updateProg });
  res.json({ status: 200, marker: updateProg });
};
axios
  .get(`http://localhost:5000/api/progress?user=${user}`)
  .then(function(response) {
    console.log(storyOrder[response.data.data]-1);
    if (Number(marker) === storyOrder[response.data.data]-1) {
      updateProgress(response.data);
    } else {
      res.status(304);
      res.json({ status: 304 });
    }
  })
  .catch(function(error) {
    console.log(error);
  });
}else{
  res.json({status: 304})
}

});

1 Ответ

0 голосов
/ 10 ноября 2018

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

Этот кусок кода называется

const getData = async data => {
    if (data.val()) {
    let tmp = await data.val();
    progress = parseInt(tmp[name].progressCounter);
    console.log(progress);
    // Return progress
    res.json({ status: 200, data: progress });
  } else {
    res.json({ status: 500, err: 'No data! ' });
  }

, так как возникает ошибка, называется

res.json({ status: 500, err: 'No data! ' });

А потом это

dataList = await userDB
  .orderByKey()
  .equalTo(name)
  .on('value', getData, errData);
} catch (err) {
  console.log('Error: ', err.message)
  res.json({ status: 500, err: 'Error while getting progress' });
}

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

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