Ошибка [ERR_HTTP_HEADERS_SENT] после изменения в базе данных - PullRequest
0 голосов
/ 08 июля 2019

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

Я попытался проверить, отправил ли я заголовки дважды, но ничего не нашел.

приложение снова работает после перезапуска сервера.

это код app.js:

app.get("/paid", verifyUser, (req, res) => {
  const claims = res.locals.decodedClaims;
  const uid = claims.uid;
  const email = claims.email;
  const userRef = db.collection("users").doc(uid);

  userRef.get().then(docSnapshot => {
    if (docSnapshot.exists) {
      userRef.onSnapshot(doc => {
        // do stuff with the data
        if (doc.data().paid) {
          res.send("paid");
          return;
        }

        res.send("Didn't pay");
      });
    } else {
      userRef.set({ paid: false, name: email }); // create the document

      res.send("<h1>hello world</h1><br>" + uid);
    }
  });
});

verifyUser middleWare (только для пояснения):

//import firebase admin module
const admin = require("firebase-admin");

module.exports = {
  // check if cookie is available and if cookie is valid
  verifyUser: (req, res, next) => {
    var sessionCookie = req.cookies.session || "";

    if (sessionCookie) {
      admin
        .auth()
        .verifySessionCookie(sessionCookie, true)
        .then(function(decodedClaims) {
          //decodedClaims is not nessecary now
          res.locals.decodedClaims = decodedClaims;
          return next();
        })
        .catch(function(err) {
          // Redirect to login page on error.
          console.log(err);

          res.redirect("/loggedOutFail");
        });
    } else {
      // Redirect to login page when no session cookie available.
      res.redirect("/loggedOutNoCookie");
    }
  }
};

это ошибка:

_http_outgoing.js:470
    throw new ERR_HTTP_HEADERS_SENT('set');
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:470:11)
    at ServerResponse.header (C:\Users\mendi\Desktop\firebase-auth\node_modules\express\lib\response.js:771:10) 
    at ServerResponse.contentType (C:\Users\mendi\Desktop\firebase-auth\node_modules\express\lib\response.js:599:15)
    at ServerResponse.send (C:\Users\mendi\Desktop\firebase-auth\node_modules\express\lib\response.js:145:14)   
    at userRef.onSnapshot.doc (C:\Users\mendi\Desktop\firebase-auth\app.js:306:13)
    at DocumentWatch.watch.onSnapshot [as onNext] (C:\Users\mendi\Desktop\firebase-auth\node_modules\@google-cloud\firestore\build\src\reference.js:404:21)
    at DocumentWatch.pushSnapshot (C:\Users\mendi\Desktop\firebase-auth\node_modules\@google-cloud\firestore\build\src\watch.js:519:18)
    at DocumentWatch.onData (C:\Users\mendi\Desktop\firebase-auth\node_modules\@google-cloud\firestore\build\src\watch.js:403:26)
    at BunWrapper.currentStream.on (C:\Users\mendi\Desktop\firebase-auth\node_modules\@google-cloud\firestore\build\src\watch.js:372:26)
    at BunWrapper.emit (events.js:189:13)

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

1 Ответ

0 голосов
/ 09 июля 2019

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

вот правильный код для app.js:

   app.get("/paid", verifyUser, (req, res) => {
  const claims = res.locals.decodedClaims;
  const uid = claims.uid;
  const email = claims.email;
  const userRef = db.collection("users").doc(uid);

  userRef
    .get()
    .then(docSnapshot => {
      // check if user document exists, if not create it
      if (!docSnapshot.exists) {
        userRef.set({ paid: false, name: email });
        res.send("User Created" + res.locals.decodedClaims.uid);
        return;
      }

      //check if user paid
      if (docSnapshot.data().paid) {
        res.send("Paid");
        return;
      } else {
        res.send("Didn't pay!");
        return;
      }
    })
    .catch(err => {
      console.log(5);
      throw err;
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...