Javascript 使用承诺正确处理Express错误,避免发送错误\u HTTP\u头\u
因此,我一直在网上浏览大量stackoverflow帖子和文章,但似乎找不到阻止承诺并将响应返回给用户的正确方法 我目前有相关的异步承诺,承诺A需要在承诺B开始之前解决这些承诺。如果其中任何地方出现错误,我希望使用Javascript 使用承诺正确处理Express错误,避免发送错误\u HTTP\u头\u,javascript,node.js,express,promise,Javascript,Node.js,Express,Promise,因此,我一直在网上浏览大量stackoverflow帖子和文章,但似乎找不到阻止承诺并将响应返回给用户的正确方法 我目前有相关的异步承诺,承诺A需要在承诺B开始之前解决这些承诺。如果其中任何地方出现错误,我希望使用res.json()方法将不同的错误返回给客户端。不幸的是,似乎无论我在做什么,在res发送到客户端之后,就会调用catch(next),然后尝试使用不同的头将res再次发送到客户端。这会导致错误[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头 我也
res.json()
方法将不同的错误返回给客户端。不幸的是,似乎无论我在做什么,在res
发送到客户端之后,就会调用catch(next)
,然后尝试使用不同的头将res
再次发送到客户端。这会导致错误[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头
我也尝试过使用just return语句,但这似乎只是继续到下一个.then()
,它将传递return语句所包含的任何内容
index.js:
const errorFunc = (err, req, res, next) => {
console.error(err);
return res.status(500).json({ message: 'Internal error.' });
};
app.get('/scream/:screamId/like', FBAuth, likeScream, errorFunc);
处理者
exports.likeScream = (req, res, next) => {
const likeDocument = db
.collection('likes')
.where('userHandle', '==', req.user.handle)
.where('screamId', '==', req.params.screamId)
.limit(1);
const screamDocument = db.doc(`/screams/${req.params.screamId}`);
return likeDocument
.get()
.then((data) => {
if (!data.empty) {
res
.status(HttpStatus.BAD_REQUEST)
.json({ error: 'User already liked scream' })
.send();
return Promise.reject(new Error('User already liked screams'));
} else {
return screamDocument;
}
})
.then((doc) => {
if (!doc.exists) {
res.status(404).json({ error: 'Scream not found' }).send();
return Promise.reject(new Error('Scream not found'));
}
const likeCount = doc.data().likeCount++;
return db.doc(`/screams/${req.params.screamId}`).update({ likeCount });
})
.then(() => {
const likeDetails = {
userHandle: req.user.handle,
screamId: req.params.screamId,
};
return db.collection('likes').add(likeDetails);
})
.then(() => {
return res.json({ message: 'Scream liked successfully.' });
})
.catch(next);
};
请注意,这段代码大部分来自学习firebase和react的教程。那里的代码似乎也有这个问题
那么总体而言,发送res.sendStatus(XXX)
并停止正在进行的承诺的正确方式是什么?提前感谢。您不能在res.json()之后执行res.send()
,因此我最初没有在.json()之后执行.send(),但仍然收到相同的错误。对客户端的响应仍然是{“error”:“用户已经喜欢尖叫”}。即使只使用上面编写的代码,也会抛出错误,catch块会调用errorFunc
,它会再次尝试使用其他头发送响应。在res.json()之后不能res.send()。对客户端的响应仍然是{“error”:“用户已经喜欢尖叫”}。即使只使用上面编写的代码,也会抛出错误,catch块会调用errorFunc
,它会再次尝试发送带有其他头的响应。