Маршрут Firebase все еще продолжается после состояния ошибки - PullRequest
0 голосов
/ 09 ноября 2019

Итак, я смотрел учебники о Firebase и создаю простое приложение, похожее на твиттер.

Со схемой screams и comments

В моем createScreamComment моя проблемазаключается в том, что после подтверждения отсутствия документа scream маршрут отправит статус 404 , который он сделал. Но он продолжает воздействовать и на другой возврат, который вызывает мой catch error из-за [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

exports.commentOnScream

exports.commentOnScream = (req, res) => {
    if (req.body.body.trim() === '')
        return res.status(400).json({ comment: 'Must not be empty' });

    const newComment = {
        body: req.body.body,
        createdAt: new Date().toISOString(),
        screamId: req.params.screamId,
        userHandle: req.user.handle,
        userImage: req.user.imageUrl
    };

    db.doc(`/screams/${req.params.screamId}`)
        .get()
        .then((doc) => {
            if (!doc.exists) { // triggering success stop here
                return res.status(404).json({ error: 'Scream not found' });
            } else {
                return doc.ref.update({ commentCount: doc.data().commentCount + 1 });
            }
        })
        .then(() => { // dont know why this is getting triggered already sent a 404 response
            return db.collection('comments').add(newComment);
        })
        .then(() => { // dont know why this is getting triggered already sent a 404 response
            return res.json(newComment);
        })
        .catch((err) => {
            console.log(err);
            return res.status(500).json({ error: 'Something went wrong' });
        });
};

1 Ответ

1 голос
/ 09 ноября 2019

Все ваши then обратные вызовы будут вызываться в том порядке, в котором они связаны друг с другом. Это нормальное поведение, и именно так работают цепочки обещаний. Отправка ответа через Express не приведет к прекращению цепочки.

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

.then(doc => {
    if (!doc.exists) {
        res.status(404).json({ error: 'Scream not found' });
    }
    else {
        return doc.ref.update(...)
        .then(() => {
            return db.collection('comments').add(newComment);
        })
        .then(() => {
            res.json(newComment);
        })
    }
})

В качестве альтернативы, подобные вещи становятся проще, если вы применяете синтаксис async / await, поэтому вы не получите столько вложенных обратных вызовов.

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